如何在 Synology 磁盘管理站上用 Docker 运行 OCRmyPDF 脚本自动处理 PDF
如何在 Synology 磁盘管理站上用 Docker 运行 OCRmyPDF 脚本自动处理 PDF【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF如果你有一台 Synology 磁盘管理站NAS希望把扫描版 PDF 批量加上可搜索的 OCR 文本层而不必每次都登录另一台电脑OCRmyPDF 官方文档给出一条可落地的部署路径在 Synology 上安装 Docker 包运行 OCRmyPDF 的 Docker 镜像再用项目自带的示例脚本misc/synology.py对指定目录里的 PDF 做递归处理。本文依据 docs/batch.md、示例脚本 misc/synology.py 以及 docs/docker.md 整理。适用环境与已知边界Synology 磁盘管理站NAS已安装 Synology 的 Docker 包脚本在编写时仅确认适用于 x86 架构的 Synology 产品ARM 架构产品上能否使用未知文档明确提示Synology 的 CPU 和 RAM 相对有限可能还需要额外的调整。准备确认 Docker 可用并拉取 OCRmyPDF 镜像在 DSM 套件中心安装 Docker 包。安装完成后按 docs/docker.md 的标准验证环境能否下载并执行镜像docker run hello-world这条命令成功说明系统已经可以下载和运行镜像。然后拉取 OCRmyPDF 镜像。docs/docker.md 的镜像表提供了三个选项镜像架构说明jbarlow83/ocrmypdf-alpinex86_64 和 arm64推荐镜像基于 Alpine Linuxjbarlow83/ocrmypdf-ubuntux86_64 和 arm64替代镜像基于 Ubuntujbarlow83/ocrmypdfx86_64 和 arm64目前是 ocrmypdf-ubuntu 的别名docker pull jbarlow83/ocrmypdf-alpine镜像名要留意示例脚本的 docker 命令默认使用jbarlow83/ocrmypdf而 docs/docker.md 的文字部分同时把这个裸名标注为已弃用将在今后的版本中移除。愿意修改脚本的话把脚本里的镜像名改成jbarlow83/ocrmypdf-alpine如果保持脚本原样也可以先docker pull jbarlow83/ocrmypdf避免首次运行时现场拉取。docs/docker.md 还提醒镜像的底层操作系统等细节属于实现细节可能在次版本中变化如果你要扩展或修改镜像应固定pin一个具体版本。示例脚本 synology.py 做了什么脚本位于项目 misc/synology.pydocs/batch.md 在 “Synology DiskStations” 一节完整收录了它Sample script for Synology DiskStations。脚本头部的 docstring 写着 “This script must be edited to meet your needs”所以运行前建议通读一遍确认行为符合你的要求。参数按脚本代码第一个参数扫描起始目录缺省时用当前目录.第二个参数归档目录。脚本直接读取该参数、没有默认值因此实际上必须同时提供两个参数。对每个 PDF 文件脚本依次做这些事递归遍历起始目录及其所有子目录只处理.pdf扩展名的文件其余跳过。把文件内容通过 stdin 送入容器、从 stdout 读出结果docker run --rm -i jbarlow83/ocrmypdf --deskew - -用 stdin/stdout 传文件是 docs/docker.md 推荐的方式它 “completely avoids file permission issues”不往挂载目录写任何东西容器以哪个用户运行都不影响。--deskew对应 docs/batch.md 中的参数说明Apply deskew to crooked input PDFs。OCR 结果先写回原文件所在目录文件名格式为%Y-%m-%d-%H%M_OCR_ 原文件名不含扩展名.pdf即YYYY-MM-DD-HHMM_OCR_原文件名.pdf。把 OCR 结果文件和原文件的权限都设为0o664。把 OCR 结果文件移动到归档目录第二个参数根下把原文件移动到归档目录下的no_ocr子目录。注意脚本本身不会创建no_ocr目录需要事先建好。在脚本文件所在目录写一个日志文件名格式为%Y-%m-%d-%H%M_ocrmypdf.log即YYYY-MM-DD-HHMM_ocrmypdf.log其中记录处理的目录、完整的 docker 命令和每次运行的 stderr 输出全部处理结束后写入Finished.。运行脚本并检查结果先明确脚本的副作用它会递归处理扫描目录下所有.pdf把原文件移出扫描目录归档到第二参数目录并修改文件权限。因此扫描目录和归档目录要用两个专门的目录不要把扫描目录指向不能整体搬动的文件夹。把脚本放到 NAS 上文档未详述拷贝方式在 NAS 的终端SSH中运行把两个占位符替换为 NAS 上的实际路径# SCAN_DIR存放待处理 PDF 的 NAS 目录 # ARCHIVE_DIROCR 结果归档目录先在其下建好 no_ocr 子目录 python3 synology.py SCAN_DIR ARCHIVE_DIR结果验证依据脚本自身行为描述不是固定的预期输出在脚本所在目录找到运行时间戳_ocrmypdf.log日志文件每个 PDF 会记录所用的 docker 命令与 stderr 输出处理跑完时日志以Finished.结束。归档目录根下出现带YYYY-MM-DD-HHMM_OCR_前缀的 OCR 结果文件对应的原文件出现在ARCHIVE_DIR/no_ocr子目录中。如果想在批量跑之前先确认单个文件没问题可以用 docs/docker.md 的 stdin/stdout 用法手工跑一遍docker run --rm -i jbarlow83/ocrmypdf-alpine - - input.pdf output.pdf让 NAS 自动运行脚本脚本中的注释写着 “the script is processed as root user via chron”即设计意图是由 Synology 的任务调度器chron以 root 用户定期执行。docs/batch.md 没有给出任务调度器的分步配置说明但调度任务要执行的命令就是上一节的调用把两个路径固定为你的扫描目录和归档目录即可。可选替代watcher.py 监控目录方式如果你的目标不是“定期扫一个目录”而是“文件一放进目录就自动处理”docs/batch.md 还提供了 watched folder 方式watcher 服务已包含在 OCRmyPDF 的 Docker 镜像里。docker run \ --volume SCAN_DIR:/input \ --volume OUTPUT_DIR:/output \ --volume PROCESSED_DIR:/processed \ --env OCR_OUTPUT_DIRECTORY_YEAR_MONTH1 \ --env OCR_ON_SUCCESS_ARCHIVE1 \ --env OCR_DESKEW1 \ --env PYTHONUNBUFFERED1 \ --interactive --tty --entrypoint python3 \ jbarlow83/ocrmypdf \ /app/watcher.py三个占位符分别是输入文件夹放 PDF 的位置、OCR 结果存放文件夹、已处理原文件的存放文件夹替换为 NAS 上的实际路径。行为服务监视匹配/input/*.pdf的文件把 OCR 后的 PDF 写入/output/并把已处理的原文件移到/processed。环境变量含义OCR_OUTPUT_DIRECTORY_YEAR_MONTH1把输出按{output}/{year}/{month}/{filename}存放OCR_ON_SUCCESS_ARCHIVE1在处理成功后移动原文件OCR_DESKEW1对倾斜的输入 PDF 应用 deskewPYTHONUNBUFFERED1让 stdout 不缓冲以便在 docker logs 中看到消息。文档明确的注意点镜像默认以非 root 的app用户uid 1000运行可能无法写入/output和/processed卷需要加--user参数正确取值取决于你使用 rootful Docker、rootless Docker 还是 Podman见 docs/docker.md 的 “Bind-mounted volumes” 一节。该服务依靠轮询检测文件系统变化可能不适合一些环境例如通过慢速网络共享的文件系统。watchmedo在网络上文件系统中可能无法正常工作源目录和目标目录相同时可能造成无限循环监视目录里做拷贝以外的操作复制、删除、移动、目录操作会触发大量错误此时应暂停监视目录。需要服务常驻时docs/batch.md 指向示例配置 misc/docker-compose.example.ymlrestart: alwaysentrypoint 为python3命令为/app/watcher.py。注意该文件里的user字段是占位符需要按你的运行时填入自己的 uid:gid文件内注释给出了 rootful Docker、rootless Docker、Podman 分别对应的取值。已知限制脚本在编写时只确认适用于 x86 架构的 Synology 产品ARM 架构产品上是否可用未知。文档明确提示针对 Synology 相对有限的 CPU 和 RAM可能还需要进一步调整。watcher 方式基于轮询且watchmedo在网络上文件系统中可能不工作用于网络存储卷时留意上述 caveat。【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考