OCRmyPDF Docker 镜像 {#docker}
OCRmyPDF 也提供 Docker 镜像,其中包含了所有依赖项的最新版本。
对于已经安装了 Docker 的用户来说,这可能是一个简单方便的选择。
在 Linux 以外的平台上,Docker 运行在虚拟机中,因此性能可能稍差。您可能还需要调整 Docker 虚拟机的内存和 CPU 分配。在 Linux 上,Docker 镜像本地运行,性能与系统安装相当。
安装 Docker 镜像
如果您的系统上安装了 Docker,您可以安装最新发布的 Docker 镜像。
如果您能成功运行此命令,则您的系统已准备好下载并执行该镜像
docker run hello-world
镜像 |
架构 |
描述 |
---|---|---|
|
x86_64 和 arm64 |
推荐镜像,基于 Alpine Linux。 |
|
x86_64 和 arm64 |
备用镜像,基于 Ubuntu。当 Alpine 镜像被认为稳定并可用于 arm64 时,此镜像将被弃用。 |
|
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 run --rm -i jbarlow83/ocrmypdf-alpine (... all other arguments here...) - -
为了方便起见,创建一个 shell 别名来隐藏 Docker 命令。将输入文件作为 stdin 发送并从 stdout 读取输出更简单——这完全避免了 Docker 带来的混乱权限问题。
alias docker_ocrmypdf='docker run --rm -i jbarlow83/ocrmypdf-alpine'
docker_ocrmypdf --version # runs docker version
docker_ocrmypdf - - <input.pdf >output.pdf
或者在出色的 fish shell 中
alias docker_ocrmypdf 'docker run --rm jbarlow83/ocrmypdf-alpine'
funcsave docker_ocrmypdf
或者,您可以将本地当前工作目录挂载为 Docker 卷
alias docker_ocrmypdf='docker run --rm -i --user "$(id -u):$(id -g)" --workdir /data -v "$PWD:/data" jbarlow83/ocrmypdf-alpine'
docker_ocrmypdf /data/input.pdf /data/output.pdf
Podman
特别是如果您使用 Podman(或在系统上启用了 SELinux),您可能需要在其中添加 --userns keep-id
,否则可能会遇到访问错误,因为用户否则不会映射到与主机相同的 UID
alias podman_ocrmypdf='podman run --rm -i --user "$(id -u):$(id -g)" --userns keep-id --workdir /data -v "$PWD:/data" ocrmypdf'
podman_ocrmypdf /data/input.pdf /data/output.pdf
如果您使用 SELinux,可能还需要为卷添加 :Z
后缀,或者使用 --security-opt label=disable
禁用容器的 SELinux,这对于系统文件来说是建议的,因为它们不应被重新标记。详情请参阅链接的 podman 文档末尾的“注意”部分。
为 Docker 镜像添加语言
默认情况下,Docker 镜像包含英语、德语、简体中文、法语、葡萄牙语和西班牙语,这些是根据反馈最受 OCRmyPDF 用户欢迎的语言。您可以通过基于公开镜像创建一个新的 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 Web 服务封装器
OCRmyPDF Docker 镜像包含一个示例性的、极简的 HTTP Web 服务。该 Web 服务可以按如下方式启动
docker run --entrypoint python -p 5000:5000 jbarlow83/ocrmypdf webservice.py
我们省略了 --rm
参数,这样容器在退出时不会自动删除。
这将配置机器监听端口 5000。在 Linux 机器上,这是 localhost 的端口 5000。在运行 Docker 的 macOS 或 Windows 机器上,这是运行您的 Docker 镜像的虚拟机的端口 5000。您可以使用命令 docker-machine ip
查找其 IP 地址。
与命令行用法不同,该程序将打开一个套接字并等待连接。
警告
OCRmyPDF Web 服务封装器旨在用于演示或开发。它不提供安全性、不提供身份验证、不提供拒绝服务攻击防护,也不提供负载均衡。使用了默认的 Flask WSGI 服务器,该服务器仅用于开发。服务器是单线程的,因此一次只能响应一个客户端。在运行 OCR 时,它无法响应任何其他客户端。
客户端在等待 OCR 完成期间必须保持连接打开。这可能需要设置较长的超时时间;此接口对于内部 HTTP API 调用更有用。
与 OCRmyPDF 的其他部分不同,此 Web 服务采用 Affero GPLv3 (AGPLv3) 许可,因为 Ghostscript 也以此方式许可。
除了上述内容,请阅读我们关于 将 OCRmyPDF 用作服务 <ocr-service>
的一般说明
。