OCRmyPDF Docker 镜像

OCRmyPDF 也可以在 Docker 镜像中使用,这些镜像打包了所有依赖项的最新版本。

对于已经安装了 Docker 的用户来说,这可能是一个简单且方便的选择。

在非Linux平台上,Docker运行在虚拟机中,因此性能可能较低。您可能还需要调整Docker虚拟机的内存和CPU分配。在Linux上,Docker镜像本机运行,性能与系统安装相当。

安装Docker镜像

如果您的系统上安装了Docker,您可以安装最新版本的Docker镜像。

如果你能成功运行这个命令,你的系统已经准备好下载并执行镜像:

docker run hello-world
Docker images

图像

架构

描述

jbarlow83/ocrmypdf-alpine

x86_64 和 arm64

推荐使用的镜像,基于 Alpine Linux。

jbarlow83/ocrmypdf-ubuntu

x86_64 和 arm64

基于 Ubuntu 的替代镜像。当 Alpine 镜像被认为稳定并可用于 arm64 时,此镜像将被弃用。

jbarlow83/ocrmypdf

x86_64 和 arm64

目前是 ocrmypdf-ubuntu 的别名。当 Alpine 镜像被认为稳定并且可用于 arm64 时,此名称将指向 Alpine 镜像。如果您不了解 Alpine 和 Ubuntu 之间的区别,请使用此镜像。

安装方法:

docker pull jbarlow83/ocrmypdf-alpine

ocrmypdf 镜像仍然可用,但已被弃用,并将在未来移除。

OCRmyPDF 将使用所有可用的 CPU 核心。如果您在 macOS 或 Windows 上使用 Docker,可能需要手动分配更多资源,请参阅 Docker 文档以了解在其他平台上调整内存和 CPU。在 Linux 上,所有资源将自动可用。

Docker 镜像中的底层操作系统和其他细节被视为实现细节,并且可能会在次要版本中发生变化。如果您正在修改镜像,您应该固定您打算使用的版本。

在命令行上使用Docker镜像

与典型的Docker容器不同,在本节中,OCRmyPDF Docker容器是临时的——它只为一个OCR任务运行并终止,就像命令行程序一样。我们使用Docker来交付一个应用程序(与更传统的情况相反,即Docker容器作为服务器运行)。因此,我们通常使用--rm参数在容器退出时删除它。

启动一个Docker容器(镜像的实例):

docker tag jbarlow83/ocrmypdf-alpine ocrmypdf
docker run --rm -i ocrmypdf (... all other arguments here...) - -

为了方便起见,创建一个shell别名来隐藏Docker命令。将输入文件作为stdin发送并从stdout读取输出更容易——这完全避免了Docker的繁琐权限问题

alias docker_ocrmypdf='docker run --rm -i ocrmypdf'
docker_ocrmypdf --version  # runs docker version
docker_ocrmypdf - - <input.pdf >output.pdf

或者在美妙的 fish shell 中:

alias docker_ocrmypdf 'docker run --rm ocrmypdf'
funcsave docker_ocrmypdf

或者,您可以将本地当前工作目录挂载为 Docker 卷:

alias docker_ocrmypdf='docker run --rm  -i --user "$(id -u):$(id -g)" --workdir /data -v "$PWD:/data" ocrmypdf'
docker_ocrmypdf /data/input.pdf /data/output.pdf

向Docker镜像添加语言

默认情况下,Docker 镜像包含英语、德语、简体中文、法语、葡萄牙语和西班牙语,这些是根据 OCRmyPDF 用户反馈最受欢迎的语言。您可以通过基于公共 Dockerfile 创建新的 Dockerfile 来添加其他语言。

FROM jbarlow83/ocrmypdf

# Example: add Italian
RUN apt install tesseract-ocr-ita

要安装语言包(训练数据),例如 tessdata_best 套件或 自定义数据,您首先需要确定 Tesseract 数据文件的版本,该版本 可能与 Tesseract 程序版本不同。使用以下命令确定数据 文件版本:

docker run -i --rm --entrypoint /bin/ls jbarlow83/ocrmypdf /usr/share/tesseract-ocr

截至2021年,数据文件版本可能是4.00

然后,您可以使用Dockerfile添加新数据:

FROM jbarlow83/ocrmypdf:{TAG}

# Example: add a tessdata_best file
COPY chi_tra_vert.traineddata /usr/share/tesseract-ocr/<data version>/tessdata/

在创建自己的镜像时,您应该始终固定OCRmyPDF Docker镜像的特定版本。这可以确保在OCRmyPDF发布新版本时,您的镜像不会出现问题。

或者,您可以按照以下方式将训练数据复制到Docker容器中:

docker cp mycustomtraining.traineddata name_of_container:/usr/share/tesseract-ocr/<tesseract version>/tessdata/

扩展Docker镜像

您可以扩展Docker镜像以添加自己的自定义内容,类似于扩展它以添加语言包的方式。

请注意,Docker镜像可能会随时更改。例如,基础镜像可能会更新到Ubuntu或Debian的较新版本。这些更改将在发布说明中注明,但可能会在次要版本发布时发生,除非Docker镜像的“普通”用户受到影响。

如果您扩展了Docker镜像,您应该固定OCRmyPDF Docker镜像的特定版本。

执行测试套件

OCRmyPDF 测试套件已与图像一起安装。要运行它:

docker run --rm --entrypoint python  jbarlow83/ocrmypdf -m pytest

访问shell

要在Docker镜像中使用shell:

docker run -it --entrypoint sh  jbarlow83/ocrmypdf

使用OCRmyPDF网络服务封装器

OCRmyPDF Docker 镜像包含一个示例的、基础的 HTTP 网络服务。该网络服务可以按如下方式启动:

docker run --entrypoint python -p 5000:5000  jbarlow83/ocrmypdf webservice.py

我们省略了--rm参数,以便容器在退出时不会自动删除。

这将配置机器监听端口5000。在Linux机器上,这是本地主机的端口5000。在运行Docker的macOS或Windows机器上,这是运行Docker镜像的虚拟机的端口5000。您可以使用命令docker-machine ip找到其IP地址。

与命令行使用不同,此程序将打开一个套接字并等待连接。

警告

OCRmyPDF 网络服务包装器旨在用于演示或开发。它不提供安全性、身份验证、防止拒绝服务攻击的保护或负载均衡。默认使用 Flask WSGI 服务器,该服务器仅用于开发。服务器是单线程的,因此一次只能响应一个客户端。在进行 OCR 时,它无法响应任何其他客户端。

客户端在等待OCR完成时必须保持其连接开放。这可能涉及设置较长的超时时间;此接口更适合内部HTTP API调用。

与OCRmyPDF的其他部分不同,此网络服务是根据Affero GPLv3(AGPLv3)许可的,因为Ghostscript也是以这种方式许可的。

除了上述内容外,请阅读我们的 关于将OCRmyPDF作为服务使用的一般说明