diff --git a/.docker/webservice.dockerfile b/.docker/webservice.dockerfile new file mode 100644 index 00000000..385637d4 --- /dev/null +++ b/.docker/webservice.dockerfile @@ -0,0 +1,19 @@ +# OCRmyPDF webservice +# +FROM jbarlow83/ocrmypdf-polyglot:latest + +USER root + +# Update system and install our dependencies +RUN apt-get update && apt-get install -y --no-install-recommends \ + python3-flask + +RUN apt-get autoremove -y && apt-get clean -y + +EXPOSE 5000 + +COPY .docker/webservice.py /application + +USER docker + +ENTRYPOINT ["python3", "/application/webservice.py"] diff --git a/.docker/webservice.py b/.docker/webservice.py new file mode 100644 index 00000000..897f8dcf --- /dev/null +++ b/.docker/webservice.py @@ -0,0 +1,69 @@ +from flask import Flask, Response, flash, request, redirect, url_for, abort, send_from_directory +from subprocess import run, PIPE +from tempfile import TemporaryDirectory +from werkzeug.utils import secure_filename +import os +import shlex + +app = Flask(__name__) +app.secret_key = "secret" + +uploaddir = TemporaryDirectory(prefix="ocrmypdf-upload") +downloaddir = TemporaryDirectory(prefix="ocrmypdf-download") + +app.config["UPLOAD_FOLDER"] = uploaddir +ALLOWED_EXTENSIONS = set(["pdf"]) + + +def allowed_file(filename): + return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS + + +def do_ocrmypdf(file): + filename = secure_filename(file.filename) + up_file = os.path.join(uploaddir.name, filename) + file.save(up_file) + down_file = os.path.join(downloaddir.name, filename) + + cmd_args = [arg for arg in shlex.split(request.form["params"])] + if "--sidecar" in cmd_args: + return Response("--sidecar not supported", 501, mimetype='text/plain') + + ocrmypdf_args = ["ocrmypdf", *cmd_args, up_file, down_file] + proc = run(ocrmypdf_args, stdout=PIPE, stderr=PIPE, encoding="utf-8") + if proc.returncode != 0: + stderr = proc.stderr + return Response(stderr, 400, mimetype='text/plain') + + return send_from_directory(downloaddir.name, filename) + + +@app.route("/", methods=["GET", "POST"]) +def upload_file(): + if request.method == "POST": + if "file" not in request.files: + return Response("No file in POST", 400, mimetype='text/plain') + file = request.files["file"] + if file.filename == "": + return Response("Empty filename", 400, mimetype='text/plain') + if not allowed_file(file.filename): + return Response("Invalid filename", 400, mimetype='text/plain') + if file and allowed_file(file.filename): + return do_ocrmypdf(file) + return Response("Some other problem", 400, mimetype='text/plain') + + return """ + + OCRmyPDF webapp +

Upload a PDF (debug UI)

+
+ + + + + +
+ """ + +if __name__ == "__main__": + app.run(host='0.0.0.0')