发行说明

OCRmyPDF 的命令行接口和公共 API 遵循语义化版本控制

OCRmyPDF 的输出消息不被视为稳定接口的一部分 - 也就是说,输出消息可以在任何发行版本中进行改进,因此解析它们可能不可靠。请使用 API 来依赖精确的行为。

公共 API 对于启动 OCRmyPDF 进程或希望使用其某些功能处理 PDF 的脚本可能很有用。

OCRmyPDF 的最新版本是 version。这些说明中提到的任何更新版本可能存在于主分支,但尚未标记。

OCRmyPDF 通常支持最新的三个 Python 版本。

注意

维护者注意:这些发行说明可能会更新,包含尚未标记的即将发布的版本的信息。一个发行版本只有在标记并发布到 PyPI 后才正式生效。

v16.10.2

  • 将 pikepdf 9.8.0 列入黑名单,因为它存在不兼容的更改。

v16.10.1

  • 对命令行终端用户而言,没有影响 OCRmyPDF 功能的更改。

  • webservice: 使 UI 中的页面规范更易于查找。

  • webservice: 修复了下载按钮下载错误文件的问题。

  • 将项目文档从 rST 转换为 Markdown。

  • 添加了 README 文档的简体中文翻译。感谢 @HuaPai。

  • 更新了 pyproject.toml 中的许可证规范。

  • 更新了 SPDX 许可证到 REUSE.toml。

v16.10.0

  • 增加了 hocr textangle 处理,改进了对倾斜文本的处理。感谢 @0dinD #1467

  • Docker 文档更新,与 podman 相关。感谢 @rugk。 #1489, #1488

  • 放弃了 webservice.py 中对 ttyd 的脆弱使用。现在,ocrmypdf 的消息会打印到控制台。

  • 修复了损坏的测试 test_hocrtransform_matches_sandwich,该测试已失效。感谢 @QuLogic 的报告。

  • 改进了 Windows 的安装说明。感谢 @alex。

v16.9.0

  • 增加了 hocr 标题处理。感谢 @0dinD #1466

  • ocrmypdf-alpine Docker 镜像现在使用 Alpine 3.21 构建。

  • 修复了包含同时定义了 ImageMask 和 ColorSpace 的无效图像的 PDF 文件的错误处理。 #1453

  • 修复了仅安装较旧 Ghostscript 版本时测试套件的回退问题。

  • 改进了 _progressbar.py 的文档。感谢 @QuentinFuxa。 #1456

  • 在 ReadTheDocs 上禁用了 PDF 文档的构建,因为这导致了复杂的构建问题,认为不值得解决。

v16.8.0

  • 使用 streamlit 升级了 webservice.py 演示。现在可以在一个简单的 Web UI 中体验 OCRmyPDF 的大部分功能。

  • 在 Dockerfile 中添加了缓存,以提高构建速度。

  • 修复了文档中大量的格式错误,这些错误导致部分文档无法正确生成。

  • 通过抑制负宽度空格改进了 OCR 文本渲染。感谢 @pajowu。 #1446

  • 在使用 --redo-ocr 时改进了对不可见文本的检测。感谢 @pajowu。 #1448`

v16.7.0

  • 修复了 Docker 构建的进一步问题,并更新了一些版本。

  • 主 Docker 镜像恢复为 Ubuntu 24.04,因为 v16.6.2 中的修复解决了该问题。

  • 之前将 Ghostscript 输出发送到 stdout 的代码已更改为输出到临时文件,因为 Ghostscript 无论如何都会在内部这样做。这是一种适度的效率提升。

  • 修复了调试日志输出被解析为 rich 标记的问题。 #1444

v16.6.2

  • 移除无效的超链接注释,以满足 Ghostscript 10.x 在 PDF/A 转换期间的要求。 #1425

v16.6.1

  • 修复了 Docker 构建的一些问题,例如移除了不必要的内容并使用了稳定的 Tesseract 版本。

  • 暂时将 Docker 镜像恢复到 Ubuntu 22.04,以访问较旧/更稳定的 Ghostscript。

  • 澄清了文档中的批量命令。

  • 修复了 HOCRResult 的 JSON 序列化和封存问题。 #1427

v16.6.0

  • 修复了损坏的 PDF 使用 --redo-ocr 会失败的问题。 #1403

  • 修复了在 Windows 上,如果图像在早期步骤中已优化,则 JBIG2 优化会失败的错误。 #1396

  • 修复了检测 unpaper 7.0.0 版本时的错误。 #1409

  • 修复了扫描页面时的性能回退。 #1378。感谢 @aliemjay。

  • 通过强制使用 Alpine 3.19 修复了 Alpine Docker 镜像。Alpine 3.20 包含有缺陷的 Tesseract OCR 版本,因此无法使用。

  • 将 Ubuntu Docker 镜像升级到使用 Ubuntu 24.04。

  • 构建和测试脚本/操作已切换到 uv。

  • 在容器中运行时,我们现在提醒用户临时文件夹位于容器内部,可能无法访问。

  • 修复了 Linux 测试覆盖率矩阵,其中缺少一些关键版本。

v16.5.0

  • 修复了解释包含具有数组掩码图像的 PDF 时出现的问题。 #1377

  • 启用了在 Python 3.13 上的测试。

  • 修复了一个无法正常工作但仍然通过的测试。 #1382

  • 改进了“PDF/A 转换失败”警告消息,以更好地描述其影响。

  • 更新了文档,以更好地解释批量处理中的 OCR_JSON_SETTINGS。

  • 构建后端从 setuptools 更改为 hatchling。

v16.4.3

  • 解决了 pdfminer.six 的一个问题,即缓冲区边界上的一个标记被错误地解析为两个标记。 #1361

  • 在计算页面最佳 DPI 以进行渲染时,对模板掩码和显式掩码应用新规则。 #1362

  • 修复了尝试使用 TeX Live 提供的、不兼容的 jbig2.EXE 的问题。 #1363

v16.4.2

  • 修复了传递给 Ghostscript 用于生成 PDF/A 的文件名顺序问题。 #1359

  • 抑制了缺少的 jbig2dec 警告消息。 #1358

  • 修复了软掩码尺寸与图像尺寸不匹配时图像尺寸的计算问题。 #1351

  • 文档中的几处修复。感谢贡献这些更改的用户 Iris 和 JoKalliauer。

  • 修复了处理缺少某些图像元数据的 PDF 文件时出错的问题。 #1315

v16.4.1

  • 修复了图像打印区域(用于查找 OCR 的加权 DPI)的计算问题。 #1334

  • 修复了日志中“NotImplementedError: not sure how to get colorspace”错误消息,该消息仅记录了优化包含印刷生产颜色空间的图像失败。 #1315

v16.4.0

  • 使用 -l/--language 选择 osdequ 伪语言时,现在在使用 Tesseract OCR 时会退出并报错,因为它们不是常规的 Tesseract 语言,而是实现的细节。使用它们可能导致 Tesseract 崩溃。

  • hOCR 渲染器对输入文件中的额外空白更具容忍度。

  • 当输入不是 .pdf 时,watcher.py 现在会将输出文件扩展名更改为 .pdf。

  • 改进了对包含循环引用 Form XObjects 的 PDF 文件的处理。 #1321

  • 修复了 ARM64 的 Alpine Docker 镜像,该镜像构建不正确。

  • Docker 镜像现在使用 pikepdf 9.0.0。

  • 阻止使用 Tesseract OCR 5.4.0,这是一个已知存在回退的版本。

  • 当设置了 --no-progress-bar 时,禁用了“线性化”的进度条。

  • 通过在测试期间安装必要的库,修复了一些关于 pikepdf 缺少 JBIG2 解码的测试警告。

v16.3.1

  • 修复了 Ghostscript 10.03.0+ 引起的测试套件失败。 #1316

  • 修复了“OCR”进度条显示问题。 #1313

v16.3.0

  • 修复了 Ghostscript PDF/A 转换时进度条不显示的问题。 #1313

  • 添加了线性化的进度条。 #1313

  • 如果使用 --rotate-pages-threshold 但未同时使用 --rotate-pages,现在会退出并报错,因为用户可能打算使用 --rotate-pages#1309

  • 如果 Tesseract hOCR 给出无效的行框,则打印错误消息而不是退出并报错。 #1312

v16.2.0

  • 修复了优化某些 PDF 时出现 'NoneType' 对象没有 'get' 属性的问题。 #1293, #1271

  • 将格式化工具从 black 切换到 ruff。

  • 添加了对将附带文件输出发送到 io.BytesIO 的支持。

  • 添加了对将 HEIF/HEIC 图像(iPhone 和其他一些设备的原生图像格式)转换为 PDF 的支持,前提是安装了相应的 pi-hief 库。该库被标记为依赖项,但维护者可以根据需要选择不使用。

  • 我们现在默认下采样会超过 Tesseract 内部限制的大图像,但仅在会导致处理失败时。以前,此行为仅在命令行上特别请求时发生。现在仍然可以配置和禁用。请参阅 --tesseract 命令行选项。

  • 添加了 Macports 安装说明。感谢 @akierig。

  • 改进了在尝试获取第三方程序版本时发生意外错误的日志输出。

v16.1.2

  • 修复了使用 Ghostscript 10.3 时的测试套件失败问题。

  • 其他小的修正。

v16.1.1

  • 修复了对 PyPy 3.10 的支持。

v16.1.0

  • 改进的 hOCR 渲染器现在是左到右语言的默认设置。

  • 改进了旋转页面的处理。以前,OCR 文本可能会丢失包含 /Rotate 标签的旋转页面。

  • 改进了裁剪页面的处理。以前,在某些情况下,具有裁剪框的页面无法正确应用 OCR,可能导致 OCR 文本与可见文本 misalignment。

  • 文档改进,特别是针对不常见平台的安装说明。

v16.0.4

  • 修复了使用新的 hOCR 渲染器处理从左到右文本的一些问题。它仍未默认,但很快就会默认。从右到左文本仍在进行中。

  • 添加了一个错误,以防止使用几个似乎损坏现有文本的旧版 Ghostscript。新生成的 OCR 不受影响。为获得最佳效果,请使用包含该问题修复的 Ghostscript 10.02.1 或更新版本。

v16.0.3

  • 将所需的最低 Ghostscript 版本更改为 9.54,以支持 RHEL 9 及其衍生版的用户,因为这是该版本中可用的最新版本。

  • 删除了关于 CVE-2023-43115 的警告消息,假设大多数发行版已经回补了补丁。

v16.0.2

  • 暂时将 PDF 文本渲染器默认改回 sandwich,以解决 macOS Preview 中的回退问题。

v16.0.1

  • 修复了新 hOCR 文本渲染器的文本渲染问题 - 多余的字节顺序标记。

  • 收紧了依赖项。

v16.0.0

  • 添加了 OCR 文本渲染器,结合了 Tesseract 的 PDF 生成器和旧版 hOCR 转换渲染器的最佳想法。结果有望永久解决提取文本中 wordssmushedtogetherwithoutspaces 的问题,更好地对齐/定位倾斜基线上的文本 #1009,修复了使用德国 Fraktur 脚本时的字符输出问题 #1191,正确渲染从右到左的语言(阿拉伯语、希伯来语、波斯语) #1157。与预期相比,亚洲语言可能仍然存在过多的单词分隔。新渲染器是默认设置;旧版 sandwich 渲染器仍然可用,使用 --pdf-renderer sandwich;旧版 hOCR 渲染器已不存在。

  • ocrmypdf.hocrtransform API 已发生实质性变化。

  • 已停止支持 Python 3.9。现在需要 Python 3.10+。

  • 现在需要 pikepdf >= 8.8.0。

v15.4.4

  • 修复了 Windows 上安装 Ghostscript 的文档问题。 #1198

  • 增加了关于旧版 Ghostscript 中安全问题的警告消息。

v15.4.3

  • 修复了旧于 8.7.1 的 pikepdf 中的弃用警告;现在需要 pikepdf >= 8.7.1。

v15.4.2

  • 对于某类 PDF 文件,我们现在会引发异常,这些文件可能需要选择明确的颜色转换策略才能正确显示以进行 PDF/A 转换。

  • 修复了在移除调试日志处理器后尝试写入日志消息时发生的错误。

v15.4.1

  • 修复了 misc/watcher.py 回退问题:接受 --ocr-json-settings 作为文件名或 JSON 字符串,与之前一样;以及参数计数不匹配。 #1183, #1185

  • 我们不再尝试在 PDF 输出中设置 /ProcSet,因为这是一个过时的 PDF 功能。

  • 文档改进。

v15.4.0

  • 新增实验性 API,支持离线编辑最终文本。具体而言,现在可以使用 OCRmyPDF 生成 hOCR 文件,使用其他工具对其进行编辑,然后最终确定 PDF。这些 API 是实验性的,可能随时更改,包括工作文件夹的使用细节。没有命令行界面。

  • 代码重组:执行器、进度条、初始化和设置。

  • 修复了覆盖率工具无法正确追踪到线程或子进程时测试覆盖率的问题。这部分代码仍然被测试,但显示为未覆盖。

  • 在测试套件中,减少了对子进程和其他干扰覆盖率测量的技术的依赖。

  • 改进了当我们似乎在 snap 容器内运行且文件不可用时的错误检查。

  • 插件规范现在正确地将进度条定义为协议,而不是将其定义为“类似 tqdm”。

  • 我们现在默认在 POSIX 平台上使用“forkserver”进程创建方式,而不是 fork,因为这种方法更健壮,并避免了线程存在时的一些问题。

  • 修复了用户请求 --no-use-threads 被忽略的情况。

  • 如果 PDF 的顶级对象没有语言元数据,我们将添加 OCR 语言。

  • 将一些神秘的测试错误消息替换为更有用的消息。

  • 关于 OCRmyPDF 如何为页面选择颜色空间的调试消息现在更具描述性。

v15.3.1

  • 修复了上一版本中 misc/watcher.py 的日志设置问题。 #1180

  • 我们现在尝试在创建输出文件时保留输入的扩展属性。

  • 由于某种原因,macOS 构建现在需要显式安装 OpenSSL。

  • 更新了关于 Docker 性能问题的文档。

v15.3.0

  • 更新 misc/watcher.py 以使用 Typer 改进命令行界面,并支持 .env 指定环境变量。改进了错误消息。感谢 @mflagg2814 的 PR,促成了此改进。

  • 改进了当我们运行在 snap 容器中导致文件无法读取时的错误消息。

v15.2.0

  • 新增基于 Alpine Linux 的 Docker 镜像。该镜像比基于 Ubuntu 的镜像更小,可能在某些情况下有用。目前托管在 jbarlow83/ocrmypdf-alpine。目前不提供 ARM 版本。

  • Ubuntu Docker 现在别名为 jbarlow83/ocrmypdf-ubuntu。

  • 更新了 Docker 文档。

v15.1.0

  • 由于 Pillow 的所有早期版本中存在严重安全漏洞,我们现在要求 Pillow 10.0.1。该漏洞涉及 WebP 图像,在 OCRmyPDF 从恶意 WebP 图像创建 PDF 时可能被触发。

  • ocrmypdf.ocr 添加了一些以前接受但未记录的关键字参数。

  • 文档更新和类型改进。

v15.0.2

  • 将 Python 3.12 添加到测试矩阵。

  • 更新了文档,包含了 Python 3.12、32 位支持和 v15 中的一些新功能的说明。

v15.0.1

  • Wheels Python 标签更改为 py39。

  • 标记一个在最近 Ghostscript 版本中失败的测试为预期失败。

  • 澄清了关于 32 位支持范围的文档和发行说明。

  • 更新了安装文档以反映 v15 中的更改。

v15.0.0

  • 停止支持 Python 3.8。

  • 总体而言,停止支持早于 Ubuntu 22.04 提供的所有依赖项。具体而言,放弃了 coloredlogstqdm,转而使用 rich - 详细信息请参阅 pyproject.toml。总的来说,Ubuntu 22.04 是我们的新基线系统。

  • 收紧了某些依赖项的版本要求。

  • 停止支持 32 位 Linux wheels。我们强烈建议使用 64 位操作系统以及 64 位版本的 Python、Tesseract 和 Ghostscript 来使用 OCRmyPDF。我们的许多依赖项正在放弃 32 位构建(例如 Pillow),我们也正在效仿。(维护者仍然可以从源代码构建 32 位版本。)

  • 更改为 PyPI 发布的可信版本。

  • pikepdf 内存映射再次启用以提高性能,现在 pikepdf 中的一个功能问题已得到修复。

  • ocrmypdf.helpers.calculate_downsample 之前有两个变体,一个接受 PIL.Image,另一个接受 tuple[int, int]。后者已被移除。

  • ocrmypdf 的 snap 版本现在基于 Ubuntu core22。

  • 我们现在考虑了页面上只有一小部分图像以高 DPI(分辨率)绘制的情况。以前,整个页面将以任何特征的最高分辨率进行栅格化,这导致了性能问题。现在,页面以基于页面平均 DPI 的分辨率进行栅格化,并根据每个特征占据的区域进行加权。通常,PDF 中小面积的高分辨率是错误或反复使用资产造成的怪癖,高分辨率并无益处。 #1010, #1104, #1004, #1079, #1010

  • Ghostscript 颜色转换策略现在可以使用 --color-conversion-strategy 进行配置。 #1143

  • JBIG2 优化阈值现在可以使用 --jbig2-threshold 进行配置。 #1133

v14.4.0

  • 现在可以检测到数字签名 PDF。如果 PDF 已签名,OCRmyPDF 将拒绝修改它。以前只检测加密的 PDF,而不检测已签名但未加密的 PDF。 #1040

  • 此外,可以使用 --invalidate-digital-signatures 来覆盖上述行为并修改 PDF。 #1040

  • tqdm 进度条替换为“rich”进度条。rich 库是一个新依赖项。某些使用 tqdm 的 API 现在已弃用,并将在下一主要版本中移除。

  • 改进了与 GitHub Releases 的集成。感谢 @stumpylog。

v14.3.0

  • 将 master 分支重命名为 main。

  • 通过对 Ghostscript 使用 -dPDFSTOPONERROR 选项,提高了 PDF 栅格化精度。如果您无论如何都想渲染 PDF,请使用 --continue-on-soft-render-error。插件规范已调整以支持此功能;插件作者可能希望调整 PDF 栅格化和渲染插件。 #1083

  • 计算的倾斜角度现在记录在日志输出中。 #1101

  • 现在可以通过将元数据类型(例如 --title)设置为空字符串来取消设置元数据。 #1117, #1059

  • 修复了由于使用集合而导致的语言顺序随机问题。当为 OCR 设置多种语言时,这可能会导致输出有所不同。 #1113

  • 澄清了日志输出中报告的优化比率。

  • 文档改进。

v14.2.1

  • 修复了 #977,即 Form XObjects 内部的图像总是被排除在图像优化之外的问题。

v14.2.0

  • 添加了 --tesseract-downsample-above,用于下采样较大的图像,即使它们未超过 Tesseract 的内部限制。这可以用于加快 OCR 速度,但可能会牺牲准确性。

  • 修复了较旧 Pillow 上的重采样 AttributeError 问题。 #1096

  • 删除了关于在包含 UserUnit 特征的 PDF 上使用 Ghostscript 的错误。以前 Ghostscript 无法处理这些 PDF,但在所有支持的版本中现在都支持,因此不再需要该错误。

  • 改进了关于为 Tesseract 安装其他语言包的文档。

v14.1.0

  • 添加了 --tesseract-non-ocr-timeout。这允许使用 Tesseract 的倾斜校正和其他非 OCR 功能,同时使用 --tesseract-timeout 0 禁用 OCR。

  • 添加了 --tesseract-downsample-large-images。这会对超过 Tesseract 最大图像大小限制的大图像进行下采样。大图像处理可能仍然需要很长时间,但如果需要处理,这可以使其能够处理。

  • 修复了 #1082,一个 snap 打包构建问题。

  • 将 linter 更改为 ruff,修复 lint 错误,更新文档。

v14.0.4

  • 修复了 #1066, #1075,处理某些格式错误的 PDF 时出现的异常。

v14.0.3

  • 修复了 #1068,在以 root 身份运行时避免删除 /dev/null。

  • 其他文档修复。

v14.0.2

  • 修复了 #1052,处理某些不规范 PDF 时出现的异常。

  • 明确记录了不再支持 Windows 32 位。

  • 修复了源代码安装说明。

  • 其他文档修复。

v14.0.1

  • 修复了一些使用智能版本比较进行的版本检查。

  • 在 Docker 镜像中添加了缺失的 jbig2dec。

v14.0.0

  • 停止支持 Python 3.7。

  • 总体而言,停止支持早于 Ubuntu 20.04 提供的所有依赖项。

  • 现在需要 Ghostscript 9.50 或更新版本。支持旧版本的 shim 已移除。

  • 现在需要 Tesseract 4.1.1 或更新版本。支持旧版本的 shim 已移除。

  • Docker 镜像现在使用 Tesseract 5。

  • 删除了 setup.cfg 配置,转而使用 pyproject.toml。

  • 删除了弃用异常 PdfMergeFailedError。

  • 移除或替换了一些公共领域测试文件。我们旨在实现 100% 符合 SPDX,并总体上简化版权。

v13.7.0

  • 修复了尝试运行但 Tesseract 未安装时出现的异常。

  • 更改为 SPDX 许可证跟踪和信息文件。

v13.6.2

  • 为 Python 3.7 和 3.8 添加了一个 shim,以防止出现“错误处理期间发生错误”。

  • 更新了一些类型注解。

  • 改进了对 _windows 模块的注解,以帮助 IDE 和 mypy 理解我们的代码。

v13.6.1

  • 要求 setuptools-scm 7.0.5,以避免早期版本 setuptools-scm 中可能出现的源代码分发问题。

  • 抑制不必要的警告,改进测试,改进类型和其他杂项。

v13.6.0

  • 添加了一个新的 initialize 插件钩子,使得更容易抑制内置插件以及其他可能性。

  • 修复了 unpaper 退出时出现“wrong stream”错误的问题,这可能与图像宽度为奇数整数有关。 #887, #665

v13.5.0

  • 新增了 optimize_pdf 插件钩子,使得可以创建替换或增强 OCRmyPDF PDF 优化器的插件。

  • 移除了所有最大版本限制。我们的新策略是拉黑已知不良版本,仅阻止已知不良版本的依赖项。

  • 容纳 OCRmyPDF 插入的所有 OCR 文本的对象的命名方案已更改。这始终是实现细节(并保持如此),但如果有人依赖它,可能会 appreciate 此通知。

  • 清理。

v13.4.7

  • 修复了极少数情况下清理临时文件时出现的 PermissionError。 #974

  • 修复了在缺少 os.nice 的平台上调用它时出现的 PermissionError。 #973

  • 抑制了测试期间来自 libxmp 的一些警告。

v13.4.6

  • 将损坏 ICC 配置文件的错误转换为警告。感谢 @oscherler。

v13.4.5

  • 移除了 pdfminer.six 版本的上限限制。

  • 文档。

v13.4.4

  • 更新了 pdfminer.six 版本。

  • Docker 镜像更改为 Ubuntu 22.04,因为它已发布并提供了我们所需的依赖项。这似乎比我们最近更改为 Debian 更一致。

v13.4.3

  • 修复了使用较旧版本 pytest 时 pytest.skip() 的错误。

  • 文档更新。

v13.4.2

  • 解决了 Ghostscript 9.56.0 中的一个重大回退,该版本将 PDF 中的所有 OCR 文本删除。它会简单地删除所有文本,即使是 OCRmyPDF 之外的软件生成的文本。幸运的是,我们可以要求 Ghostscript 9.56.0 使用其旧的行为,该行为对我们的目的来说是正确的。用户必须避免(Ghostscript 9.56.0,ocrmypdf <13.4.2)的组合,因为旧版本的 OCRmyPDF 无法检测到这个特定版本的 Ghostscript 会删除所有 OCR 文本。

  • 标记 pdfminer 20220319 为支持。

  • 修复了最近版本 Pillow 和 pytest 的一些弃用警告。

  • 测试套件现在涵盖 Python 3.10(Python 3.10 之前运行良好,但未进行测试)。

  • Docker 镜像现在使用 debian:bookworm-slim 作为基础镜像来修复 Docker 镜像构建。

v13.4.1

  • 暂时将线程而不是进程设置为默认执行器工作者,因为使用进程时存在持久的死锁问题。添加了一个新的命令行参数 --no-use-threads 来禁用此功能。

v13.4.0

  • 修复了使用 pikepdf 5.0.0 时的测试失败。

  • 优化器的各种改进。特别是,我们现在能够识别同时使用 deflate (PNG) 和 DCT (JPEG) 编码的 PDF 图像,并生成使用 deflate 和 DCT 压缩图像的 PDF,因为这通常比纯 DCT 产生更小的文件大小。

v13.3.0

  • 将优化图像失败后的一个无害但“可怕”的异常变得不那么可怕。

  • 如果页面图像太大无法被 unpaper 清理,则添加警告。该图像将不经清理直接通过。这是由于 unpaper 使用的 C 库中硬编码的限制,因此无法轻易修复。

  • 调用 img2pdf 时,我们现在使用更好的默认设置。

  • 在某些情况下,我们不再尝试优化未能保存的图像。

  • 我们现在会考虑 Tesseract 5 和 Tesseract 4 之间文本输出的一些差异。

  • 更好地处理 Ghostscript 在尝试栅格化页面图像时生成空图像的情况。

v13.2.0

  • 由于标准库中已弃用 distutils,因此移除了所有运行时使用 distutils 的情况。我们之前使用 distutils.version 在运行时检查依赖项的版本号,现在使用 packaging.version。这是一个新的依赖项。

  • 修复了当 Ghostscript 未安装时,相关错误消息被抑制的问题。

  • 修复了进度条中显示的页面号和总数不正确的问题。这纯粹是显示/呈现问题。 #876

v13.1.1

  • 修复了尝试在 Tesseract 5 上进行空白页面去倾斜的问题。 #868

v13.1.0

  • 更改为使用基于 Python concurrent.futures 的并行执行,而不是 pools,因为 futures 现在在功能上已超过 pools。

  • 如果子工作进程被终止(可能是被操作系统或用户在任务管理器中杀死),并行任务将失败并显示错误消息。以前,主 ocrmypdf 进程会无限期“挂起”,等待子进程报告。

  • 添加了新参数 --tesseract-thresholding,用于控制 Tesseract 5 的阈值参数。

  • 文档更新和更改。更好的 --output-type none 文档,几版前已添加。移除了一些过时的文档。

  • 改进了 bash 补全 - 感谢 @FPille。

v13.0.0

重大变化

  • 已移除弃用的模块 ocrmypdf.leptonica

  • 我们不再依赖 Leptonica (liblept) 或 CFFI (libffi, python3-cffi)。(注意,Tesseract 仍然需要 Leptonica;OCRmyPDF 不再直接使用此库。)

  • 参数 --remove-background 暂时禁用,同时我们寻找 Leptonica 实现此功能的替代方案。

  • 参数 --threshold 已移除,因为它也依赖于 Leptonica。Tesseract 5.x 已在阈值处理方面进行了改进,因此此功能无论如何都将是多余的。

  • --deskew 之前由 Leptonica 算法计算。我们现在使用 Tesseract 的一个功能来查找适合页面去倾斜的角度。根据 Tesseract 计算的倾斜角度可能与 Leptonica 算法不同。理论上,Tesseract 的倾斜角度是基于更复杂的分析,因此总体而言应该能提高结果。我们还使用 Pillow 执行去倾斜操作,这可能会影响图像的外观,与 Leptonica 不同。

  • 已停止支持 Python 3.6,因为该版本已接近生命周期结束。

  • 我们现在需要 pikepdf 4.0 或更新版本。这意味着 OCRmyPDF 需要与 manylinux2014 规范兼容的系统。此更改是由于 Pillow 不再发布 manylinux2010 wheels 而“被迫”进行的。

  • 我们不再提供 requirements.txt 样式的文件。请改用 pip install ocrmypdf[...]。这些文件将在 v13 中删除。

  • 提升了几个库的必需版本。

修复

  • 修复了在 Windows 上即使 Ghostscript 已安装也无法找到并退出报错的问题。

  • 通过移除 Leptonica,我们修复了 Apple Silicon 上所有与 Leptonica 相关的问题,或 Leptonica 在 Windows 上导入失败的问题。

v12.7.2

  • 修复了使用非标准版本“5.0.0-rc1.20211030”打包 Tesseract 时的“invalid version number”错误。

  • 修复了使用已弃用的 importlib.resources.read_binary

  • 将一些字符串路径替换为 pathlib.Path

  • 修复了使用 --output-type none 时泄露的文件句柄。

  • 移除了支持不再受支持的 pikepdf 版本的 shim。

v12.7.1

  • 声明支持 pdfminer.six v20211012。

v12.7.0

  • 修复了使用 pybind11 2.8.0 编译的 pikepdf 3.2.0 时的测试套件失败。 #843

  • 改进了关于如果 OCR 因此原因失败时使用 --max-image-mpixels 的建议。

  • 次要文档修复。(感谢 @mara004。)

  • 在标准库实现足够的 Python 版本上,无需 importlib-metadata 和 importlib-resources backports。(感谢 Marco Genasci。)

v12.6.0

  • 实现了 --output-type=none,以跳过生成 PDF,适用于只需要附带文件的应用程序 (#787)。

  • 修复了 --jbig2-lossy 行为描述中的歧义。

  • 文档的各种改进。

v12.5.0

  • 修复了 PyPy 3.6 和 pikepdf 3.0 组合的构建失败。这种组合在源代码构建中可以工作,但在 wheels 中无法工作。

  • 接受了希望升级我们已弃用的 requirements.txt 的机器人。

  • 文档更新。

  • 将 pkg_resources 和对 setuptools 的安装依赖项替换为 importlib-metadata 和 importlib-resources。

  • 修复了 hocrtransform 中的回归,导致在使用此渲染器时文本被省略。

  • 修复了一些类型错误。

v12.4.0

  • 嫁接文本层时,如果 pikepdf 的 unparse_content_stream 可用,则使用它。

  • 确认支持 pluggy 1.0。(感谢 @QuLogic。)

  • 修复了一些类型问题,改进了 pre-commit 设置,并修复了 linter 标记的问题。

  • 现在支持 PyPy 7.3.3 (=Python 3.6)。请注意,PyPy 不一定运行得更快,因为 OCRmyPDF 的绝大部分执行时间都花在运行 OCR 或执行原生代码上。然而,PyPy 在某些领域可能会带来速度提升。

v12.3.3

  • watcher.py: 修复了布尔环境变量的解释问题 (#821)。

  • 调整 CI 脚本以测试 Tesseract 5 beta 版本。

  • 记录我们对 Tesseract 5 beta 版本的支持。

v12.3.2

  • 表示支持 flask 2.x, watcher 2.x (#815, #816)。

v12.3.1

  • 修复了使用 hOCR 渲染器时文本选择问题 (#813)。

  • 通过升级到较新的 Ubuntu 修复了 Docker 镜像的构建错误。还设置了此镜像的时区为 UTC。

v12.3.0

  • 修复了 Pillow 8.3.0 中引入的回归。Pillow 不再对图像分辨率进行 DPI 四舍五入。我们现在考虑了这一点 (#802)。

  • 我们不再使用 pikepdf 最新版本中已弃用的一些 API 调用。

  • 改进了请求的语言看起来不像典型的 ISO 639-2 代码时的错误消息。

  • 修复了一些在 Windows 上尝试创建符号链接的测试,这些测试在 Windows 桌面版上会失败,但在 CI 上通常不会失败。

  • 文档修复(感谢 @mara004)

v12.2.0

  • 修复了 Windows 上无效的 Tesseract 版本号问题 (#795)。

  • 文档调整。文档构建现在依赖于 sphinx-issues 包。

v12.1.0

  • 出于安全考虑,我们现在要求 Pillow >= 8.2.x。(如果无法升级,旧版本仍将继续工作。)

  • 构建系统已重组,依赖于 setup.cfg 而不是 setup.py。所有更改都应该适用于以前支持的 setuptools 版本。

  • requirements/* 中的文件现在被视为已弃用,但将保留到 v12。请改为使用 pip install ocrmypdf[test],而不是 requirements/test.txt 等。这些文件将在 v13 中删除。

v12.0.3

  • 扩展了 hocr PDF 渲染器支持的语言列表。以前有几种语言被认为不受支持,特别是那些使用拉丁字母的非欧洲语言。

  • 修复了在详细模式下异常堆栈跟踪被抑制的情况。

  • 改进了关于商业 OCR 的文档。

v12.0.2

  • 修复了在包含小图像的文件上使用 --remove-background 时抛出的异常 (#769)。

  • 改进了关于向 Docker 镜像添加语言包的文档,并纠正了法语语言包的名称。

v12.0.1

  • 修复了未标记 Tesseract 版本中的“invalid version number”问题 (#770)。

v12.0.0

重大变化

  • 由于 pikepdf、Pillow 和 reportlab 最近的安全问题,我们现在要求这些库及其某些依赖项使用更新版本。(如有必要,软件包维护者可以自行决定覆盖这些版本;较低版本通常也可以工作。)

  • 我们在指导 Ghostscript 创建 PDF/A 时,现在使用“LeaveColorUnchanged”颜色转换策略。通常这比执行颜色转换更快,而且颜色转换并非总是必要的。

  • OCR 文本现在被打包在一个 Form XObject 中。这使得从其他文档内容中隔离 OCR 文本更容易。但是,一些实现不佳的 PDF 文本提取算法可能无法检测到文本。

  • 许多 API 函数的参数检查更加严格,或者需要在之前不需要关键字参数的地方使用关键字参数。

  • 已移除 ocrmypdf.optimize 中的一些已弃用函数。

  • 由于在 Apple Silicon 等新平台上的 ABI 绑定策略存在困难,ocrmypdf.leptonica 模块现在已弃用。它将被移除并替换,要么通过将 Leptonica 重新打包为独立库,要么使用其他图像处理库。

  • 持续集成迁移到 GitHub Actions。

  • 我们不再依赖 pytest_helpers_namespace 进行测试。

新功能

  • 新增插件钩子:get_progressbar_class,用于进度报告,允许开发者用其他机制替换标准控制台进度条,例如更新 GUI 进度条。

  • 新增插件钩子:get_executor,用于替换并发模型。这主要支持在 AWS Lambda 等非标准执行环境上运行,这些环境由于缺少共享内存而不支持标准的 Python multiprocessing

  • 新增插件钩子:get_logging_console,用于替换 OCRmyPDF 输出消息的标准方式。

  • 新增插件钩子:filter_pdf_page,用于修改 OCRmyPDF 生成的单个 PDF 页面。

  • OCRmyPDF 现在可以在没有进程间信号量(如 AWS Lambda 和 Android Termux)的非标准执行环境上运行。如果环境没有信号量,OCRmyPDF 会自动选择不使用信号量的替代进程执行器。

  • 持续集成迁移到 GitHub Actions。

  • 我们现在会生成 ARM64 兼容的 Docker 镜像以及 x64 镜像。感谢 @andkrause 几个月前在拉取请求中完成了大部分工作,我们终于能够将其整合。还要感谢 @0x326 的审阅意见。

修复

  • 修复了在使用旧版本 Leptonica 时尝试刷新 sys.stderr 时可能出现的死锁问题。

  • 一些工作进程继承了父进程的资源,例如日志处理器,这可能也导致了死锁。这些资源现在已被释放。

  • 测试覆盖率有所改进。

  • 移除了对早于 4.0.0-beta1 版本的 Tesseract 的支持残留(4.0.0-beta1 版本随 Ubuntu 18.04 发布)。

  • OCRmyPDF 现在可以解析所有 Tesseract 版本号,因为已经使用了几种方案。

  • 修复了解析包含以缩放比例 0 绘制图像的 PDF 时出现的问题。( #761)

  • 删除了关于禁用 mmap 的重复消息。

v11.7.3

  • 将 CCITT Group 3 图像排除在优化之外。OCRmyPDF 使用的一些库似乎无法正确处理这种不常见的压缩格式。如果没有此修复,您可能会遇到错误或潜在的损坏输出图像。

v11.7.2

  • 更新了 main.txt 中锁定的版本,主要是由于 Pillow 最近披露的安全漏洞,将 Pillow 升级到 8.1.2。

  • --sidecar 参数现在如果设置为与输入或输出 PDF 相同的文件,将导致异常。

v11.7.1

  • 尝试图像优化时的一些异常仅记录在调试级别,导致它们被抑制。这些错误现在已正确记录。

  • 改进了与 --unpaper-args 相关的错误消息。

  • 更新了文档,提到了新的 conda 分发。

v11.7.0

  • 我们现在支持将 --sidecar--pages 结合使用;这些参数以前是互斥的。(#735

  • 修复了 PDF/A-1b 生成的可能问题。Acrobat 抱怨我们的 PDF 使用对象流。更强大的 PDF/A 验证器(如 veraPDF)不认为这是一个问题,但从现在起我们将遵从 Acrobat 的异议。这可能会增加 PDF/A-1b 文件的文件大小。PDF/A-2b 文件不受影响。

v11.6.2

  • 修复了使用 --deskew --rotate-pages 等参数时产生的页面方向错误的问题 (#730)。

v11.6.1

  • 修复了尝试优化异常窄幅图像的问题,通过将这些图像排除在优化之外来解决 (#732)。

  • 移除已弃用的兼容性 shim,该 shim 用于不再受支持的 pikepdf 版本。

v11.6.0

  • OCRmyPDF 现在会自动注册来自同一虚拟环境的插件,使用适当的 setuptools 入口点。

  • 重构插件管理器,以移除不必要的复杂性并使插件注册更加自动化。

  • PageContextPdfContext 现在正式成为 API 的一部分,它们本来就应该如此,因为它们是 ocrmypdf.pluginspec 的一部分。

v11.5.0

  • 修复了使用 --force-ocr 且页面包含具有多种分辨率的对象时,输出页面尺寸由于舍入而可能略有差异的问题。

  • 在确定用于栅格化页面的分辨率时,我们现在认为页面上的打印文本需要更高的分辨率。这修复了某些页面以不可接受的低分辨率文本渲染的问题,但可能会增加某些工作流程中可接受低分辨率文本的输出文件大小。

  • 添加了一个解决方法,以修复在 Apple ARM 芯片(或潜在地,不允许写+可执行内存的其他平台)上尝试 import ocrmypdf.leptonica 时发生的异常。

v11.4.5

  • 修复了在使用 API 时文件可能未关闭的问题。

  • 改进了 setup.cfg,为测试覆盖率提供了更好的设置。

v11.4.4

  • 修复了 AttributeError: 'NoneType' object has no attribute 'userunit' (#700),这与 OCRmyPDF 未正确转发 pdfminer.six 的错误消息有关。

  • 调整了一些参数的类型。

  • ocrmypdf.ocr 现在接受一个 threading.Lock,原因在文档中概述。

v11.4.3

  • 移除了一个冗余的调试消息。

  • 测试套件现在断言大多数修补的函数在应该调用时已被调用。

  • 测试套件现在跳过一个在 piekpdf 的两个特定版本中失败的测试。

v11.4.2

  • 希望修复了对 Cygwin 的支持。

  • watcher.py: 修复了 OCR_LOGLEVEL 未被解释的问题。

v11.4.1

  • 修复了使用 pages 参数传递无效页面范围(例如“1-0”)时导致未处理异常的问题。

  • 接受了用户对 misc/synology.py 中的 Synology 演示脚本所做的贡献。

  • 澄清了关于临时文件位置更改 ocrmypdf.io 的文档。

  • 修复了 Python wheel 标签,该标签错误地设置为 py35,尽管我们早已停止支持 Python 3.5。

v11.4.0

  • 查找 Tesseract 和 Ghostscript 时,我们现在检查 Windows 注册表,查看其安装程序是否注册了可执行文件的位置。这应该有助于将这些程序安装到非标准位置的 Windows 用户。

  • 我们现在报告 PDF/A 转换的进度,因为此操作有时会很慢。

  • 改进了命令行补全。

  • OCRmyPDF 创建的临时文件夹的前缀已从 com.github.ocrmypdf 更改为 ocrmypdf.io。依赖此前缀的脚本可能需要进行调整。(这始终是实现细节,因此不被视为语义版本控制“合同”的一部分。)

  • 修复了 #692,其中一个包含格式错误字体的特定文件会通过生成过多的调试消息来淹没内部消息队列。

  • 修复了处理没有页面记录的 hOCR 文件时出现的异常。Tesseract 已知不会生成此类文件。

v11.3.4

  • 修复了使用 pikepdf 2.1.0 时可能出现的错误消息“called readLinearizationData for file that is not linearized”。(升级到 pikepdf 2.1.1 也能解决此问题。)

  • 文件监视程序现在除了 .pdf 外,还会自动包含 .PDF,以更好地支持区分大小写的文件系统。

  • 一些文档和评论改进。

v11.3.3

  • 如果 unpaper 输出非 UTF-8 数据,则默默地修复此问题,而不是在转换时中断。(可能解决了 #671。)

v11.3.2

  • 在 Python 3.9 上运行时,明确要求 pikepdf 2.0.0 或更新版本。(担心 pybind11 2.5.x 在 Python 3.9 下的稳定性问题,该版本用于 pikepdf 1.x。)

  • 修复了另一个与页面旋转相关的问题。

  • 修复了标记为图像掩码的图像未被正确视为优化候选对象的问题。

  • 在某些系统上,unpaper 似乎无法处理我们提供给它的 PNG 输入。我们现在将输入转换为 PNM 格式,unpaper 总是接受这种格式。修复了 #665#667

  • 发送到 unpaper 的 DPI 现在四舍五入到更合理的十进制位数。

  • unpaper 的调试和错误消息被抑制了。

  • 一些文档调整。

v11.3.1

  • 声明支持新版本:pdfminer.six 20201018 和 pikepdf 2.x

  • 修复了与 --pdfa-image-compression 相关的警告,该警告在错误的时间出现。

v11.3.0

  • 当 OCR 被禁用时,“OCR”步骤在输出消息中描述为“图像处理”,以更好地解释应用程序的行为。

  • 调试日志现在仅在命令行运行时创建,而不是在 API 调用执行 OCR 时创建。设置日志是调用应用程序的责任。

  • 对于页面数较少的 PDF 文件,我们在线程而不是进程中收集了输入 PDF 的信息(当页面数更多时)。当作为线程运行时,我们没有关闭工作 PDF 的文件句柄,导致每次调用 ocrmypdf.ocr 都泄露一个文件句柄。

  • 修复了子工作进程发送的调试消息与父进程的日志设置不匹配,导致消息丢失的问题。此问题仅影响父进程未 fork 的 macOS 和 Windows。

  • 修复了 rasterize_pdf_page 的 hookspec,以移除 pluggy 未按预期处理的默认参数。

  • 由于上述问题,修复了自动页面旋转的另一个问题 (#658)。

v11.2.1

  • 修复了将带有调色板或关联 ICC 的 1 位图像优化为 JBIG2 时,其颜色可能反转的问题。

v11.2.0

  • 修复了优化带有软掩码或图像掩码的 PNG 类型图像的问题。这是在 v11.1.0(或附近)引入的回归。

  • 改进了 ocrmypdf.ocr API 调用中 plugins 参数的类型检查。

v11.1.2

  • 修复了 hOCR 渲染器大致以反向顺序写入文本的问题。这不应影响能够正确查找所有文本位置的合理智能的 PDF 阅读器,但可能会混淆依赖内容流中对象顺序的阅读器。(#642

v11.1.1

  • 使用 pngquant 时,我们现在避免使用命名临时文件,从而允许使用容器化的 pngquant 安装。

  • 澄清了一个错误消息。

  • 发行版本中 1 出现次数最多的版本!

v11.1.0

  • 修复了页面旋转问题:#634, #589

  • 修复了某些优化创建无效图像(例如 1 位“RGB”图像)的情况:#629, #620

  • 现在,嫁接页面时,调试日志中会显示页面号。

  • ocrmypdf.optimize.rewrite_png 和 ocrmypdf.optimize.rewrite_png_as_g4 已被标记为弃用。严格来说,这些应该是内部 API,但从未隐藏过。

  • 为预防起见,由于在某些对象被释放时导致崩溃的罕见竞争条件,已禁用 pikepdf 基于 mmap 的文件访问。问题可能出在 pikepdf 的依赖项 pybind11 中。

  • 扩展了示例插件,以演示转换为单色。

v11.0.2

  • 修复了 #612,TypeError 异常。通过消除不必要地修复输入 PDF 元数据内存中的问题来修复。

v11.0.1

  • 将 pdfminer.six 20200720 列入黑名单,该版本在 20200726 中修复了回归。

  • Approve img2pdf 0.4 as it passes tests.

  • 澄清:pdfa.py 中受 GPL-3 许可的部分已在 v11.0.0 的变更中移除;debian/copyright 文件未正确标注此变更。

v11.0.0

  • 项目许可变更为 Mozilla Public License 2.0。部分杂项代码现采用 MIT 许可,非代码内容/媒体仍采用 CC-BY-SA 4.0。此许可变更已获得项目中曾对 GPLv3 许可部分做出贡献的所有人的批准。(#600)

  • 由于许可变更,此版本被视为主要版本更新;但与 v10.x 相比,功能行为或 API 没有已知的不兼容变更。

v10.3.3

  • 修复了在图像上使用 --threshold 时出现的 “KeyError: ‘dpi’” 错误消息。(#607)

v10.3.2

  • 修复了当我们可以确定原因时,却报告文件大小增加“没有原因”的情况。

  • 启用了对 pdfminer.six 20200726 的支持。

v10.3.1

  • 修复了 pdfminer.six 版本低于 20200402 时,测试套件中的多个失败。

  • 启用了对 pdfminer.six 20200720 的支持。

v10.3.0

  • 修复了一个问题:我们之前会考虑已经 JBIG2 编码的图像进行优化,这可能会产生比原始图像优化效果更差的图像。我们不认为这个问题会导致图像保真度下降。

  • 在可用时,现在使用 pikepdf 内存映射。这提高了性能。

  • 安装 Leptonica 1.79+ 时,使用其新的错误处理 API,避免了为捕获其错误消息而必须进行的 stderr “杂乱”重定向。

  • 对于旧版本的 Leptonica,增加了一个新的线程级锁。这修复了处理 Leptonica 错误情况时可能出现的竞争条件(尽管没有证据表明它在实践中曾导致问题)。

  • 文档改进和更多类型提示。

v10.2.1

  • 禁用了使用 pdfminer 计算文本框顺序的功能。我们从未需要此结果,并且在具有复杂预先存在的文本的文件上计算它是昂贵的。

  • 修复了插件管理器以接受 Path(plugin) 作为插件路径。

  • 修复了一些类型错误。

  • 文档改进。

v10.2.0

  • 更新 Docker 镜像以使用 Ubuntu 20.04。

  • 修复了 PDF/A 转换后获得标题“Untitled”的问题。(#582)

  • 修复了一个问题:当使用 --pdf-renderer hocr 时,使用较新版本的 Tesseract 会导致输出中丢失部分文本。Tesseract 开始添加关于文本语义的更详细标记,而我们的 HOCR 转换未能识别这些标记,因此忽略了它们。此选项不是默认选项。如有必要,--redo-ocr 也可以通过重新进行 OCR 来解决此类问题。

  • 修复了 Python 3.9 beta 中的一个错误,原因是移除了已弃用的 Element.getchildren()。(#584)

  • 实现了对使用 BytesIO 和其他文件流对象进行 API 调用的支持。(#545)

v10.1.1

  • 修复了在某些输入文件上出现的 OMP_THREAD_LIMIT 设置为无效值错误消息。(除了在某些情况下性能不理想外,该错误是无害的。)

v10.1.0

  • 之前,我们使用 --clean-final 会导致 unpaper 清理后的页面图像被生成两次,这在某些情况下是必要的,但通常不是。我们现在利用此优化机会,并在可能的情况下重用图像。

  • 我们现在将 PNG 文件作为输入提供给 unpaper,因为它接受 PNG,而不是生成可能非常大的 PPM 文件。这可以提高性能并减少临时磁盘使用。

  • 更新了插件文档。

v10.0.1

  • 修复了从命令行使用 -l lang1+lang2 时的回归问题。

v10.0.0

重大变化

  • 已停止支持 pdfminer.six 版本 20181108,并移除了使其此版本工作的 monkeypatch。

  • 现在输出消息将以颜色显示(如果终端支持),并移除了描述消息严重性的前缀。因此,解析 OCRmyPDF 日志消息的程序需要进行修改。(请考虑改用 OCRmyPDF 作为库使用。)

  • 某些依赖项的最低版本已提高。

  • 许多 API 变更;请参阅开发者变更。

  • 现在需要 Python 库 pluggy 和 coloredlogs。

新功能和改进

  • PDF 页面扫描现在在 CPU 之间并行进行,对于页数较多的文件,这一阶段的速度大幅提升。

  • 优化了 PDF 页面扫描,解决了某些性能回归问题。

  • 使用 --pages 参数时,不再对未选定的页面进行 PDF 页面扫描。

  • PDF 页面扫描现在独立于 Ghostscript,结束了我们过去对 Ghostscript 中这一偶尔不稳定的功能的依赖。

  • 增加了插件架构,目前允许用户更容易地使用 Tesseract 以外的 OCR 引擎或 Ghostscript 以外的 PDF 渲染器。插件还可以覆盖某些决策,例如在初步扫描后更改 OCR 设置。

  • 彩色日志消息。

开发者变更

  • 已移除用于测试 Tesseract 和 Ghostscript 失败情况正确处理的测试欺骗机制,转而使用插件进行测试。欺骗机制相当复杂,需要许多针对 Windows 的特殊技巧。

  • 描述图像 DPI 分辨率的代码已被重构为 ocrmypdf.helpers.Resolution 类。

  • 模块 ocrmypdf._exec 现在对于 OCRmyPDF 是私有的。

  • 模块 ocrmypdf.hocrtransform 已更新以遵循 PEP8 命名约定。

  • Ghostscript 不再用于查找 PDF 中文本的位置,并且与此功能相关的 API 已被移除。

  • 大量内部重组以支持插件。

v9.8.2

  • 修复了 OCRmyPDF 在确定文档是否已有文本时,会忽略 Form XObject 内的文本的问题。

  • 修复了文件大小增加警告,考虑了小文件的开销。

  • 添加了 Cygwin 上的安装说明。

v9.8.1

  • 修复了 %PROGRAMFILES%\gs 目录 (Windows) 中意外文件导致异常的问题。

  • 标记 pdfminer.six 20200517 为支持版本。

  • 如果 jbig2enc 缺失且请求优化,则会发出警告而不是错误,这是预期的行为。

  • 文档更新。

v9.8.0

  • 修复了一个问题:文件中只有第一个 PNG (FlateDecode) 图像会被考虑用于优化。从现在起,文件大小应该有所改善。

  • 修复了选择日文语言时出现的启动崩溃问题 (#543)。

  • 在 watcher.py 中添加了配置轮询和日志级别的选项。

v9.7.2

  • 修复了 ocrmypdf.ocr(...language=) 不接受文档中列出的语言列表的问题。

  • 更新了 setup.py 以确认支持 pdfminer.six 版本 20200402。

v9.7.1

  • 修复了与 qpdf 10.0.0 一起使用时版本检查失败的问题。

  • 添加了一些缺失的类型注释。

  • 更新了文档,警告需要使用 “ifmain” 防护和 Windows。

v9.7.0

  • 修复了 watcher.py 中未定义 OCR_JSON_SETTINGS 时的错误。

  • Ghostscript 9.51 现已列入黑名单,原因是此版本存在诸多问题。

  • 添加了针对 Ghostscript 9.52 中 “txtwrite” 问题的变通方法。

  • 修复了当 OMP_THREAD_LIMIT 被操作时显示的线程数不正确的问题。

  • 移除了对于在同一页面上使用数百到数千张图像的文件可能存在的性能瓶颈。

  • 文档改进。

  • 优化现在将应用于一些定义了颜色配置文件而不是仅黑白的单色图像。

  • 确定图像的简化颜色空间时,会参考 ICC 配置文件。

v9.6.1

  • 文档改进 - 感谢许多用户的贡献!

    • 修复了 ArchLinux (@pigmonkey) 的安装说明。

    • 更新了 FreeBSD 和其他操作系统 (@knobix) 的安装说明。

    • 添加了将 Docker Compose 与 watchdog (@ianalexander, @deisi) 一起使用的说明。

    • 其他杂项 (@mb720, @toy, @caiofacchinato)。

    • 文档中提供的一些脚本已迁移出来,以便可以作为整个文件复制,并确保保持语法检查。

  • 修复了导致 bash 补全在 macOS 上失败的错误。(#502, #504; @AlexanderWillner)

  • 修复了一个罕见的情况:OCRmyPDF 在处理其 /Trailer /Info 中包含错误对象类型的 PDF 时抛出异常。现在该错误会被记录,并且会忽略不正确的对象。(#497)

  • 移除了可能非自由的文件 enron1.pdf 并简化了使用它的测试。

  • 移除了可能非自由的文件 misc/media/logo.afdesign

v9.6.0

  • 修复了在某些情况下将元数据从输入 PDF 传输到输出 PDF 的回归问题。

  • pdfminer.six 现在支持到版本 2020-01-24。

  • 使用 --rotate-pages 时,解释页面旋转决策的消息现在再次显示在标准详细程度级别。在之前的一些版本中,它们被设置为仅在使用参数 -v1 时出现的调试级别消息。

  • 改进了 misc/watcher.py。感谢 @ianalexander 和 @svenihoney。

  • 文档改进。

v9.5.0

  • 添加了 API 函数来测量 OCR 质量。

  • 适度改进了处理具有困难/不合规元数据的 PDF 的方式。

v9.4.0

  • 更新了推荐的依赖版本。

  • 改进了测试覆盖率,并更改了以便更好地测量测试覆盖率,例如在子进程中运行测试时。

  • 改进了 Leptonica 安装不正确时的错误消息。

  • 修复了 pytest “session scope” 的使用,这可能导致一些间歇性的 CI 失败。

  • 当参数 --keep-temporary-files 或详细程度设置为 -v1 时,会在工作临时文件夹中生成一个调试日志文件。

v9.3.0

  • 改进了原生 Windows 支持:我们现在检查“Program Files”文件夹中的明显位置,寻找 Tesseract 和 Ghostscript 的安装,而不是依赖用户编辑 PATH 来指定它们的位置。PATH 环境变量仍然可以用来区分存在多个安装或程序安装在非标准位置的情况。

  • 修复了解析 Ghostscript 错误消息时的异常。

  • 添加了一个改进的示例,演示如何设置一个被监视的文件夹进行自动 OCR 处理(感谢 @ianalexander 的贡献)。

v9.2.0

  • 现已支持原生 Windows。

  • 持续集成已迁移到 Azure Pipelines。

  • 改进了测试覆盖率并提高了测试速度。

  • 修复了一个问题:当原始页面是 JPEG 且选择了预处理选项以及 --output-type=pdf,并且原始页面上的所有图像都是 JPEGs 时,页面会被保存为 PNG,导致文件大小增加。这是自 v7.0.0 以来的回归。

  • OCRmyPDF 不再依赖 QPDF 可执行文件 qpdflibqpdf。它使用 pikepdf(而 pikepdf 又依赖于 libqpdf)。软件包维护者应调整依赖项,以便 OCRmyPDF 不再自行调用 libqpdf。对于 Python 二进制轮子的用户来说,此更改意味着不再需要单独安装 QPDF。此更改主要是为了简化 Windows 上的安装。

  • 修复了一个罕见的情况:Tesseract 的日志消息会被丢弃。

  • 修复了 pixFindPageForeground 的函数签名不正确的问题,导致在某些平台/Leptonica 版本上出现异常。

v9.1.1

  • 扩展了支持的 pdfminer.six 版本范围。

  • 修复了使用 pikepdf 1.7.0 时 Docker 构建失败的问题。

  • 修复了文档,建议使用 get-pip.py 中的 pip 进行安装。

v9.1.0

  • 改进了输出时文件大小增加的诊断。现在会在 JBIG2 或 pngquant 不可用时发出警告。

  • 现在需要 pikepdf 1.7.0,以获取移除在运行 Python 3.8 的 Linux 系统上需要源码安装的变更。

v9.0.5

  • Alpine Docker 镜像 (jbarlow83/ocrmypdf-alpine) 已被停用,原因是支持 Alpine Linux 困难。

  • 主 Docker 镜像 (jbarlow83/ocrmypdf) 已改进,包含以前 Alpine 镜像独有的额外功能。

  • 应用程序代码没有变更。

  • 现在支持 pdfminer.six 版本 20191020。

v9.0.4

  • 修复了与 Python 3.8 的兼容性问题(但目前需要源码安装)。

  • 修复了 Tesseract 的 --user-words--user-patterns 设置。

  • 变更为 pikepdf 1.6.5(适用于 Python 3.8)。

  • 变更为 Pillow 6.2.0(以减轻早期 Pillow 中的安全漏洞)。

  • 现在当语言环境不是英语时,调试消息会提及自动选择英语。

v9.0.3

  • 在中间的 Postscript 文件中嵌入 sRGB ICC 配置文件的编码版本(用于 PDF/A 转换)。之前我们包含的是文件名,这需要 Postscript 在启用文件访问的情况下运行。出于安全考虑,Ghostscript 9.28 默认启用 -dSAFER,因此不再允许访问任何文件。此修复对于与 Ghostscript 9.28 兼容是必需的。

  • 将一个在持续集成中有时会超时并失败的测试排除在标准测试套件之外。

v9.0.2

  • 图像优化器现在在某些情况下跳过对 flate (PNG) 编码图像的优化,因为优化工作很可能被浪费。

  • 图像优化器现在忽略指定任意解码数组的图像,因为这些图像很罕见。

  • 修复了导致单色图像中黑白颠倒的问题。我们不确定,但问题似乎与 Leptonica 1.76.0 及更早版本有关。

  • 修复了在未安装英语或德语 Tesseract 语言包时测试套件失败的某些情况。

  • 修复了未安装 Tesseract 英语语言时的运行时错误。

  • 改进了使用后明确关闭 Pillow 图像的处理。

  • 实际修复了 Alpine Docker 镜像构建问题。

  • 变更为 pikepdf 1.6.3。

v9.0.1

  • 修复了当可选依赖项 unpaper 和 pngquant 缺失时测试套件失败的问题。

  • 尝试修复 Alpine Docker 镜像构建问题。

  • 文档中说明了现在提供 FreeBSD Ports。

  • 变更为 pikepdf 1.6.1。

v9.0.0

重大变化

  • 实验性功能 --mask-barcodes 已被移除,原因是可靠性差和偶尔崩溃,两者都源于实现此功能的底层库 (Leptonica)。

  • 详细程度参数 -v 现在只接受 012

  • 停止支持 Tesseract 4.00.00-alpha 版本。Tesseract 4.0 beta 及更高版本仍受支持。

  • 移除了 ocrmypdf-polyglotocrmypdf-webservice 镜像。

新功能

  • 为希望集成 OCRmyPDF 的应用程序添加了高级 API。特别感谢 Martin Wind (@mawi1988) 在这方面做出的重大贡献。

  • 为长时间运行的步骤添加了进度条。■■■■■■■□□

  • 我们现在默认创建线性化(“快速网络查看”)PDF。新参数 --fast-web-view 提供对此功能的控制。

  • 新增 --pages 功能,用于将 OCR 限制在特定的页面范围。列表可以包含逗号或单页,例如 1, 3, 5-11

  • 当页数相对于允许的作业数较少时,我们在可用时以多线程 (OpenMP) 模式运行 Tesseract。这应该会提高页数较少的文件上的性能。

  • 移除了对 ruffus 的依赖,并随之移除了之前导致无法实现 API 的非可重入性限制。

  • 输出和日志消息已 overhauled,以便 ocrmypdf 可以集成到使用 logging 模块的应用程序中。

  • 需要 pikepdf 1.6.0。

  • 添加了徽标。😊

Bug 修复

  • 包含矢量图形的页面被视为全彩页面。之前,在考虑覆盖页面所需的颜色空间时会忽略矢量图,这可能导致在某些设置下丢失颜色。

  • 测试套件现在较少频繁地生成进程,从而可以更准确地测量代码覆盖率。

  • 改进了测试覆盖率。

  • 修复了一个罕见的除以零错误(如果优化产生无效文件)。

  • 更新了 Docker 镜像以使用更新的版本。

  • 修复了 JBIG2 编码但颜色空间不是 /DeviceGray 的图像未被正确解释的问题。

  • 修复了当页面的 MediaBox 角点非零时,OCR 文本-图像对齐问题(即对齐问题)。

v8.3.2

  • 移除了允许 macOS 在没有 pdfminer.six 的情况下工作的变通方案,现在提供了 pdfminer.six 的正确 sdist 版本。

  • 现在需要 pikepdf 1.5.0。

v8.3.1

  • 修复了包含格式错误的元数据的 PDF 会被渲染为空白页面的问题。#398

v8.3.0

  • 改进了生成新页面图像时更新页面的策略。我们现在尝试保留更多原始文件内容,特别是注解。

  • 对于超过 100 页的 PDF,如果序列中替换了一页 PDF 并跳过了一页或多页后续页面,则在嫁接 OCR 文本时中间文件会损坏,导致处理失败。这是一个回归问题,可能在 v8.2.4 中引入。

  • 之前,我们会将 Ghostscript 生成的图像缩小几个像素,以确保输出图像尺寸正好是我们想要的。现在找到了让 Ghostscript 生成精确图像尺寸的方法后,我们取消了缩放步骤。

  • 现在提供 bash 的命令行补全功能,除了 fish,都在 misc/completion 中。软件包维护者,请安装这些文件,以便用户能够利用此功能。

  • 更新了要求。

  • 现在需要 pikepdf 1.3.0。

v8.2.4

  • 修复了检查仅 Acrobat 可读取的某种类型 PDF 时的假阳性。我们现在更准确地检测仅 Acrobat PDF。

  • OCRmyPDF 持有的打开文件句柄更少,并且在不再需要时更及时地释放它们。

  • 次要优化:我们不再遍历目录以确保其中的所有引用都得到解析,因为 libqpdf 的变更使得这一点不再必要。

  • 现在需要 pikepdf 1.2.0。

v8.2.3

  • 修复了 --mask-barcodes 偶尔会在当前工作文件夹中留下不需要的临时文件 junkpixt 的问题。

  • 修复(希望如此)了在存在非标准 sys.stderr 的环境中处理 Leptonica 错误的问题。

  • 改进了 --verbose 的帮助文本。

v8.2.2

  • 修复了 v8.2.0 的回归问题,即在尝试报告 unpaper 或其他可选依赖项不可用时发生的异常。

  • 在某些情况下,未安装 unpaper 时,ocrmypdf [-c|--clean] 未能以错误退出。

v8.2.1

  • 此版本已取消。

v8.2.0

  • 感谢 @mawi12345 的辛勤工作,我们现在提供了一个重大的 Docker 镜像改进。新的 Docker 镜像 ocrmypdf-alpine 基于 Alpine Linux,并在较小的包中包含了现有三个镜像的大部分功能。这个镜像最终将取代主要的 Docker 镜像,但目前所有镜像都在构建中。详情请参阅文档

  • 文档已重新组织,特别是关于 Docker 镜像的使用。

  • 修复了 PDF 图像优化问题,优化器会不必要地解压缩和重新压缩 PNG 图像,在某些情况下会损失刚执行的量化效益。优化器现在能够在不转码的情况下将 PNG 图像嵌入到 PDF 中。

  • 修复了有损 JBIG2 图像优化中的一个次要回归问题。所有 JBIG2 候选图像都被错误地放置在整个文件的一个优化组中,而不是按页面分组。这通常会导致更大的 JBIG2Globals 字典并导致较差的压缩,因此效果不如设计。但是,质量不会受到影响。无损 JBIG2 完全不受影响。

  • 更新了依赖项,包括 pikepdf 到 1.1.0。这修复了 #358

  • 已从 setup.py 中移除某些外部程序在安装时进行的版本检查。这些检查现在在运行时执行。

  • 覆盖安装时检查的非标准选项 (setup.py install --force) 现已弃用并会打印警告。它将在未来的版本中移除。

v8.1.0

  • 新增功能 --unpaper-args,允许在使用 --clean--clean-final 时向 unpaper 传递任意参数。默认的非常保守的 unpaper 设置将被抑制。

  • 参数 --clean-final 现在隐含 --clean。在此之前,可以单独使用 --clean-final,但它不会产生任何有用的效果。

  • 修复了遍历损坏的目录条目(特别是那些具有无效目标对象的条目)时的异常。

  • 修复了在文件页数超过 100 页时使用 --tesseract-timeout 和图像处理功能的问题。#347

  • OCRmyPDF 现在总是调用 os.nice(5),向操作系统表明它是一个后台进程。

v8.0.1

  • 修复了解析缺少必填字段的 PDF 时发生的异常。#325

  • 现在需要 pikepdf 1.0.5,以解决其他一些 PDF 解析问题。

v8.0.0

没有主要功能。此版本的目的是终止对某些依赖项的旧版本的支持。

重大变化

  • 停止支持 Tesseract 3.x。现在需要 Tesseract 4.0 或更高版本。

  • 停止支持 Python 3.5。

  • v7.x 中已弃用的部分 ocrmypdf.pdfa API 已被移除。此功能已移至 pikepdf。

其他变更

  • 修复了尝试遮罩条形码时发生的未处理异常。#322

  • 现在可以在没有 pdfminer.six 的情况下使用 ocrmypdf,以支持没有或目前无法使用它的发行版(例如 Homebrew)。下游维护者应尽可能包含 pdfminer.six。

  • 当 PDF/A 转换从输入 PDF 中移除一些 XMP 元数据时,现在会发出警告。(PDF/A 中仅允许“白名单”中的某些 XMP 元数据类型。)

  • 修复了导致生成的 PDF/A 包含不符合规范的 XMP 元数据的几个问题(使用 veraPDF 验证会失败)。

  • 修复了 PDF 中的某些无效 DocumentInfo 导致 XMP 元数据创建失败的情况。

  • 修复了一些文档问题。

  • 现在需要 pikepdf 1.0.2。

v7.4.0

  • --force-ocr 现在可以与新的 --threshold--mask-barcodes 功能一起使用

  • 现在需要 pikepdf >= 0.9.1。

  • 将元数据处理变更为使用 pikepdf 0.9.1。因此,Ghostscript 9.25 或更高版本中非 ASCII 字符的元数据处理问题得到修复。

  • chardet >= 3.0.4 暂时被列为必需依赖项。pdfminer.six 依赖于它,但最新版本未指定此要求。(#326)

  • 不再需要 python-xmp-toolkit 和 libexempi。

  • 现在为希望通过简单的 HTTP 接口访问 OCRmyPDF 而不是命令行界面的用户提供了一个新的 Docker 镜像。

  • 提高了对 PDF 图形栈溢出或下溢的容忍度。(#325)

v7.3.1

  • 修复了 v7.3.0 的性能回归问题;快速页面分析未按应有的方式选择。

  • 修复了与新功能 --mask-barcodes 相关的一些异常,并改进了参数检查。

  • 添加了缺失的 TrueType 字体检测,这些字体缺少 Unicode 映射。

v7.3.0

  • 新增功能 --redo-ocr,用于检测文件中的现有 OCR,将其移除,然后重新进行 OCR。这对于希望利用 Tesseract 4.0 OCR 质量改进的用户特别有用。请注意,OCRmyPDF 3.0 版本之前添加的 OCR 无法检测,因为它在最早的版本中未被正确标记为不可见文本。从可见文本构建字体的 OCR,例如 Adobe Acrobat 的 ClearScan,也无法检测。

  • OCRmyPDF 的内容检测通常更加复杂。它能更多地了解每个 PDF 的内容,并做出更好的建议。

    • OCRmyPDF 现在可以检测 PDF 是否包含无法映射到 Unicode 的文本(意味着人眼可读,但复制粘贴后是乱码)。在这些情况下,它建议使用 --force-ocr 使文本可搜索。

    • 现在以更适合 OCR 的分辨率渲染包含矢量对象的 PDF。

    • 对于包含 Adobe LiveCycle Designer 动态 XFA 表单的 PDF,我们现在以错误退出。目前开源社区没有工具处理这些文件。

    • OCRmyPDF 现在会在包含 Adobe AcroForms 的 PDF 时发出警告,因为此类文件可能不需要 OCR。它可以处理这些文件。

  • 新增三个实验性功能,用于在某些条件下提高 OCR 质量。这些参数的名称、语法和行为可能会发生变化。它们也可能与其他一些功能不兼容。

    • --remove-vectors 用于剥离矢量图形。这可以提高 OCR 质量,因为 OCR 不会在艺术品中搜索可读文本;但是,它目前也会移除“曲线文本”。

    • --mask-barcodes 用于检测和抑制文件中的条形码。我们观察到条形码可能会干扰 OCR,因为它们“类似文本”,但实际上不是文本。

    • --threshold 使用比 Tesseract OCR 当前使用的更复杂的阈值算法。这解决了 Tesseract 4.0 中已知的问题,即深色文本在明亮背景上的处理问题。

  • 修复了当安装的 Ghostscript 版本非常旧时未报告错误消息的问题。

  • 当优化级别为 --optimize 1 或更高(默认)时,PDF 优化器现在会保存启用对象流的文件。这使得文件稍小,但需要 PDF 1.5。PDF 1.5 于 2003 年首次发布,受到 PDF 阅读器广泛支持,但一些基本的 PDF 解析器(如 PyPDF2)不理解对象流。您可以使用命令行工具 qpdf --object-streams=disablepikepdf 库来移除它们。

  • 新增依赖:pdfminer.six 20181108。请注意,这是仅支持 Python 2 的 pdfminer 的一个分支。

  • 弃用通知:到 2018 年底,我们将停止支持 Python 3.5 和 Tesseract 3.x。OCRmyPDF v7 将继续与旧版本一起工作。

v7.2.1

  • 修复了与 pikepdf 0.3.5 中 API 变更的兼容性问题。

  • 移除了一个用于在测试套件中支持早于 1.72 的 Leptonica 版本的临时方案。旧版本的 Leptonica 可能仍然兼容。唯一的影响是测试套件的一部分将被跳过。

v7.2.0

有损 JBIG2 行为变更

一位用户报告称 ocrmypdf 实际上使用了 JBIG2 的有损压缩模式。这不是预期的行为。用户应该查看 JBIG2 在有损模式下的技术考量,并决定这对他们的用例是否构成问题。

JBIG2 有损模式确实比任何其他单色压缩技术 achieves 更高的压缩比率;对于大型文本文件,节省相当可观。JBIG2 无损模式仍提供出色的压缩比率,并且是相对于旧的 CCITT G4 标准的重大改进。

只有已经审查过 JBIG2 有损模式相关问题的用户才应该选择加入。因此,有损模式 JBIG2 仅在发出新参数 --jbig2-lossy 时开启。这与 --optimize 的设置无关。

未安装可选 JBIG2 编码器的用户不受影响。

(感谢用户 ‘bsdice’ 报告此问题。)

其他问题

  • 当图像优化器将图像量化到每像素 1 位时,它现在会尝试将其进一步优化为 CCITT 或 JBIG2,而不是保留在对 1 bpp 图像效率不高的“flate”编码中。(#297)

  • 在 PDF 中用作软掩码(即透明掩码或 Alpha 通道)的图像现在被排除在优化之外。

  • 修复了 Tesseract 4.0-rc1 的处理问题,该版本现在接受无效的 Tesseract 配置文件,这导致测试套件损坏。

v7.1.0

  • 提高了初始文本提取的性能,该步骤用于确定文件是否包含某种现有文本。在大型文件上,此初步处理现在快了约 20 倍。(#299)

  • 现在需要 pikepdf 0.3.3。

  • 修复了 #231,一个关于 JPEG2000 图像的问题,其中图像元数据仅在 JPEG2000 文件内部可用。

  • 修复了一些额外的 Ghostscript 9.25 兼容性问题。

  • 改进了 KeyboardInterrupt 错误消息的处理。(#301)

  • README.md 现在在 GitHub markdown 中提供,而不是 reStructuredText。

v7.0.6

  • 将 Ghostscript 9.24 列入黑名单,因为 9.25 版本已推出并修复了 9.24 中的许多回归问题。

v7.0.5

  • 提高了与 Ghostscript 9.24 的兼容性,并在安装此版本时启用了 JPEG 透传功能。

  • Ghostscript 9.24 失去了将 PDF 标题、作者、主题和关键词元数据设置为 Unicode 字符串的功能。OCRmyPDF 将设置 ASCII 字符串,并在 Unicode 被抑制时发出警告。可以使用其他软件更新元数据。这是一个短期变通方案。

  • Kodak Capture Desktop 生成的 PDF,或目录中包含对 null 对象的间接引用的 PDF,在经过 OCRmyPDF 处理后会有一个无效的目录,这可能会干扰其他阅读器。此问题已修复。

  • 检测 Adobe LiveCycle 生成的 PDF,这些 PDF 目前只能在 Adobe Acrobat 和 Reader 中显示。遇到此类文件时,将以错误退出,而不是对“请稍候”错误消息页面执行 OCR。

v7.0.4

  • 修复了使用 -O2 优化 PDF 中嵌入的某种类型 PNG 时抛出的异常。

  • 更新到 pikepdf 0.3.2,以支持优化一些之前被排除在优化之外的额外图像类型(CMYK 和灰度)。修复了 #285

v7.0.3

  • 通过将 pikepdf 升级到 0.3.1,修复了 #284,即解析同时是图像掩码的内联图像时出错的问题。

v7.0.2

  • 修复了 v8.2.0 中 --rotate-pages 在已应用旋转的页面上的回归问题。(#279)

  • 在某些情况下,通过光栅化更高质量的预览图像来提高页面旋转质量。(#281)

v7.0.1

  • 通过拒绝具有 Alpha 通道的输入图像,修复了与 img2pdf >= 0.3.0 的兼容性问题。

  • 为 pikepdf 0.3.0 添加了前向兼容性(与 img2pdf 无关)。

  • v7.0.0 变更的各种文档更新。

v7.0.0

  • OCR 层与现有 PDF 页面结合的核心算法已重写并大幅改进。不再将 PDF 分割成单页 PDF 进行处理;相反,会渲染图像并将 OCR 结果嫁接到输入 PDF 上。新算法使用的临时磁盘空间更少,尤其对于大型文件来说性能更高。

  • 新增依赖:pikepdf。pikepdf 是一个强大的新 Python PDF 库,基于 QPDF C++ 库 (libqpdf),推动了 OCRmyPDF 的最新功能。

  • 新功能:使用 -O--optimize 进行 PDF 优化。OCR 后,OCRmyPDF 将执行与 OCR PDF 相关的图像优化。

    • 如果安装了 JBIG2 编码器,则会转换单色图像,对于大型黑白图像来说,可能会节省大量空间,因为 JBIG2 比任何其他单色(双层)压缩效率高得多。(所有与 JBIG2 相关的已知美国专利可能已经过期,但提供 JBIG2 编码器,如 jbig2enc,仍然是用户的责任。OCRmyPDF 不实现 JBIG2 编码。)

    • 如果安装了 pngquant,OCRmyPDF 将选择性地使用它来对 PNG 图像进行有损量化和压缩。

    • JPEG 的质量也可以降低,前提是较低质量的图像可能适合 OCR 后的存储。

    • 此图像优化组件最终将作为独立的命令行工具提供。

    • 优化范围从 -O0-O3,其中 0 禁用优化,3 实现所有选项。1 是默认值,仅执行安全和无损优化。(这类似于 GCC 的优化参数。)执行的具体优化类型会随时间变化。

  • 使用 --skip-text 时,页面边缘的小块文本(如水印、页码或数字印章)将不再阻止页面其余部分进行 OCR。此行为基于启发式方法。

  • 移除的功能

    • 已移除弃用的 --pdf-renderer tesseract PDF 渲染器。

    • 移除了用于生成调试文本页面的选项 -g,因为它带来了维护负担,并且仅在特定情况下有效。仍然可以通过适当设置运行 hocrtransform.py 来预览 HOCR 页面。

  • 移除的依赖项

    • PyPDF2

    • defusedxml

    • PyMuPDF

  • sandwich PDF 渲染器可与所有支持的 Tesseract 版本一起使用,包括 v3.05 之前不支持 -c textonly 的版本。(推荐使用 Tesseract v4.0.0,其效率更高。)

  • --pdf-renderer auto 选项以及用于选择 PDF 渲染器的诊断功能现在对旧版本工作得更好,但可能做出与过去版本不同的决策。

  • 如果一切成功但 PDF/A 转换失败,现在会返回一个不同的返回代码 (ExitCode.pdfa_conversion_failed (10)),而之前这种情况返回 ExitCode.invalid_output_pdf (4)。后者现在仅在有迹象表明输出文件无效时返回。

  • 下游打包者注意事项

    • 还有一个新依赖项 python-xmp-toolkit,它又依赖于 libexempi3

    • 可能需要单独 pip install pycparser 以避免另一个 Python 3.7 问题

v6.2.5

  • 由于 Tesseract 4.0rc1 行为变更,禁用了失败的测试。之前,如果 Tesseract 配置无效,它会以错误消息退出,而 OCRmyPDF 会拦截此消息。现在 Tesseract 会发出警告,OCRmyPDF v6.2.5 可能会中继或忽略该警告。(在 v7.x 中,OCRmyPDF 将响应警告。)

  • 由于可选的 PyMuPDF 安装已在 v7.x 中移除,此发布分支不再支持使用它。

  • 此发布分支不再支持 macOS。macOS 用户应升级到 v7.x。

v6.2.4

  • 回溯了 Ghostscript 9.25 兼容性修复,这移除了设置 Unicode 元数据的支持。

  • 回溯了将 Ghostscript 9.24 列入黑名单的变更。

  • 仍然支持旧版本的 Ghostscript。

v6.2.3

  • 通过拒绝具有 Alpha 通道的输入图像,修复了与 img2pdf >= 0.3.0 的兼容性问题。

  • 此版本将包含在 Ubuntu 18.10 中。

v6.2.2

  • 从 v7.0.0 回溯了 Python 3.7 和 ruffus 2.7.0 的兼容性修复。

  • 回溯了决定页面颜色的修复,忽略掩码。

  • 从 v7.0.0 回溯了一些小的改进:更好的参数验证和关于 Tesseract 4.0.0 --user-words 回归的警告。

v6.2.1

  • 修复了最近版本的 Tesseract(4.0.0-beta1 之后)未被检测为支持 sandwich 渲染器的问题 (#271)。

v6.2.0

  • Docker: Docker 镜像 ocrmypdf-tess4 已被移除。主要的 Docker 镜像 ocrmypdfocrmypdf-polyglot 现在使用 Ubuntu 18.04 作为基础镜像,因此 Tesseract 4.0.0-beta1 是它们使用的 Tesseract 版本。不再有基于 Tesseract 3.05 的 Docker 镜像。

  • 现在支持创建 PDF/A-3。但是,无法将文件附加到 PDF/A-3。

  • 列出更多可能导致文件大小增加的原因。

  • 修复了 #262,即在包含颜色映射(调色板)图像的 PDF 上使用 --remove-background 时出错的问题。

  • 修复了另一个 XMP 元数据验证问题,发生在输入文件创建日期没有时区且创建日期未被覆盖的情况下。

v6.1.5

  • 修复了 #253,在使用 hocr 渲染器时可能的除以零错误。

  • 修复了 PDF/A 的 XMP 元数据中 <xmp:ModifyDate> 字段格式不正确的问题。veraPDF 会将其标记为 PDF/A 验证失败。此错误是由于省略了修改时间的时区和秒的最后一位数字造成的,因此最坏情况下修改时间戳会四舍五入到最接近的 10 秒。

v6.1.4

  • 修复了 #248--clean 参数可能移除某些文档左栏文本的 OCR。我们现在设置 --layout none 以抑制此问题。

  • 已更新测试缓存以反映上述变更。

  • 更改测试套件以适应 Ghostscript 9.23 的新功能,该功能允许在不转码的情况下将 JPEG 插入 PDF。

  • PDF 中的 XMP 元数据现在使用 defusedxml 进行检查,以确保安全。

  • 如果子进程在查询其版本时无法报告,我们现在将清晰地以错误退出,而不是抛出异常。这发生在找到所需的执行文件但缺少共享库的情况下。

  • 现在需要 qpdf 7.0.0 或更高版本,因为测试套件无法在没有它的情况下通过。

注意事项

  • Ghostscript 9.23 中一个明显的回归会导致某些 ocrmypdf 输出文件在罕见情况下变得无效;目前的变通方法是设置 --force-ocr

v6.1.3

  • 修复了 #247/CreationDate 元数据未从输入复制到输出的问题。

  • 当在页数较多的文件上使用 Python 3.5 时,现在会发出警告,因为这种情况已知会退化到单核性能。此问题的原因未知。

v6.1.2

  • 升级到 PyMuPDF v1.12.5,其中包括对 #239 更完整的修复。

  • 添加 defusedxml 依赖项。

v6.1.1

  • 修复了如果未安装 PyMuPDF,则报告在所有页面上找到文本的问题。

v6.1.0

  • PyMuPDF 现在是一个可选但推荐的依赖项,以缓解在某些平台上 PyMuPDF 不如作者预期那样易于安装的问题。(仅适用于 6.x 版本)使用 pip install ocrmypdf[fitz] 安装 OCRmyPDF 以充分发挥其潜力。

  • 修复了 OCR 超时生成输出文件时可能发生的 FileExistsError。(#218)

  • 修复了在生成 PDF/A 时(使用 PyMuPDF),目录/书签全部重定向到第一页的问题。(不使用 PyMuPDF 时,PDF/A 模式下会移除目录。)

  • 修复了目录/书签标题包含字符 ) 时出现的“RuntimeError: invalid key in dict”。(#239)

  • 添加了一个新参数 --skip-repair,用于在 PDF 已格式正确(因为另一个程序已修复)时跳过初始 PDF 修复步骤。

v6.0.0

  • 软件许可已变更为 GPLv3 [此后又再次变更]。测试资源文件和部分独立源码可能具有其他许可。

  • OCRmyPDF 现在依赖于 PyMuPDF。包含 PyMuPDF 是变更为 GPLv3 的主要原因。

  • 其他不兼容变更

    • 不再使用 OCRMYPDF_TESSERACTOCRMYPDF_QPDFOCRMYPDF_GSOCRMYPDF_UNPAPER 环境变量。如果您需要覆盖 OCRmyPDF 使用的外部程序,请更改 PATH

    • 为避免意外导入问题,ocrmypdf 包已移至 src/ocrmypdf

    • 函数 ocrmypdf.exec.get_program 已被移除。

    • 已移除弃用的模块 ocrmypdf.pageinfo

    • 已移除 sandwich 的别名 --pdf-renderer tess4

  • 修复了 OCRmyPDF 未能检测页面上现有文本的问题,具体取决于 PDF 中文本和字体的编码方式。(#233, #232)

  • 修复了使用 --skip-text --output-type pdf 时导致文件大小急剧膨胀的问题。OCRmyPDF 现在会移除其生成的重复资源,如字体、图像和其他对象。(#237)

  • 提高了初始页面分割步骤的性能。最初认为此步骤不昂贵,并在一个进程中运行。大型文件测试发现它是瓶颈,因此现在已并行化。在四核机器上处理 700 页文件时,此更改节省了约 2 分钟。(#234)

  • 测试套件现在包含一个缓存,可用于跨平台加速测试运行。这也无需计算校验和,因此速度更快。(#217)

v5.7.0

  • 修复了在超过 4 核的机器上运行 Tesseract 4 时 CPU 利用率低的问题。(与 #217 相关。)

  • ‘hocr’ 渲染器已改进。对于大多数用例,‘sandwich’ 和 ‘tesseract’ 渲染器仍然更好,但对于使用 PDF.js 渲染器处理英语/ASCII 语言的用户来说,‘hocr’ 可能很有用。(#225

    • 它现在以更容易让某些 PDF 查看器选择和提取复制粘贴文本的方式格式化文本。这应该特别有助于 macOS Preview 和 PDF.js。

    • 选定文本的外观和选定文本的行为得到了改进。

    • PDF 内容流现在使用相对移动,使其更紧凑,并且更容易让查看器确定同一行上的两个单词。

    • 它现在可以处理倾斜基线上的文本。

    • 感谢 @cforcey 的拉取请求,@jbreiden 的许多有用建议,@ctbarbour 的又一轮改进,以及 @acaloiaro 的独立评审。

v5.6.3

  • 抑制了两个过于冗长的调试消息。

v5.6.2

  • 开发分支意外标记为发布版本。请勿使用。

v5.6.1

  • 修复了 #219:更改最终输出文件的创建方式,以避免当输出是特殊文件(如 /dev/null)时触发权限错误。

  • 修复了由于 qpdf 8.0.0 回归和 Python 3.5 对符号链接的处理方式导致的测试套件失败。

  • “加密 PDF”错误消息因 PDF 加密类型而异。现在所有类型的 PDF 加密都显示一个清晰的消息。

  • ocrmypdf 现已加入 Homebrew。建议 Homebrew 用户使用官方 homebrew-core formulas 中的 ocrmypdf 版本,而不是私人 tap。

  • 一些代码检查。

v5.6.0

  • 修复了 #216:保留“曲线文本”PDF,而不进行光栅化。

  • 与上述相关,关于光栅化的消息更加一致。

  • 为保持一致性,次要版本现在将获得它们本应拥有的末尾 .0。

v5.5

  • 添加新参数 --max-image-mpixels。Pillow 5.0 现在在图像可能是解压缩炸弹时会抛出异常。可以使用此参数覆盖 Pillow 设置的限制。

  • 修复了使用 sandwich 渲染器并在旋转和图像处理过的页面上跳过 OCR 时输出页面被裁剪的问题。

  • 当在已知会导致非拉丁字符出现问题的旧版本 Ghostscript 上使用时,现在会发出警告。

  • 修复了 -output-type pdfa-1pdfa-2 的一些参数验证检查。

v5.4.4

  • 修复了 #181:修复了页数多于系统文件句柄限制(ulimit -n)的 PDF 的最终合并失败问题。

  • 修复了 #200:PDF 中一种不常见的十进制数格式语法会导致 qpdf 发出警告,而 ocrmypdf 会将其视为错误。现在此警告会被中继。

  • 修复了中间 PDF 会被创建为版本 1.3 而不是原始文件版本的问题。这可能但不太可能产生副作用。

  • 由于 #200 之类的问题会导致 qpdf 进入无限循环,现在在使用旧版本 qpdf 时会发出警告。

  • 解决了问题 #140:如果 Tesseract 输出无效的 UTF-8,则对其进行转义并打印其消息,而不是因 Unicode 错误而中止。

  • 添加了之前未列出的 setup 要求:pytest-runner。

  • 更新文档:修复了 Synology 与 Docker 镜像示例脚本中的错误,改进了安全指南,建议使用 pip install --user

v5.4.3

  • 如果子进程在查询版本时报告失败,则以错误退出而不是抛出异常。

  • 添加了测试以确认系统语言环境是否支持 Unicode,如果不支持则提前失败。

  • 澄清了一些版权信息。

  • 更新了 pinned requirements.txt,以便 homebrew formula 能够捕获更新的版本。

v5.4.2

  • 修复了 v5.4.1 的回归问题,该问题导致 sidecar 文件创建为空文件。

v5.4.1

  • 为解决 Tesseract v4.00alpha 在尝试获取方向并安装最新语言包时崩溃的问题,添加了临时解决方案

v5.4

  • 更改了弃用警告的措辞以提高清晰度

  • 添加了根据需要生成 PDF/A-1b 输出的选项(--output-type pdfa-1);默认仍然是生成 PDF/A-2b

  • 更新文档

v5.3.3

  • 修复了在旧版本 Tesseract 上尝试强制使用 --pdf-renderer sandwich 时应出现的缺失错误消息

  • 更新测试文件中的版权信息

  • 在 Dockerfile 中将系统 LANG 设置为 UTF-8,以避免 UTF-8 编码错误

v5.3.2

  • 修复了与语言包相关的损坏测试用例

v5.3.1

  • 修复了缺少 Tesseract 语言包时返回代码错误的问题

  • 修复了 Travis 上自动 brew 时“brew audit”崩溃的问题

v5.3

  • 添加了 --user-words--user-patterns 参数,这些参数将作为单词和正则表达式转发给 Tesseract OCR,用于指导 OCR。提供特定领域的单词列表应该有助于 Tesseract 识别单词。(#165

  • 使用“hocr”渲染器处理非 Latin-1 语言时,现在会警告可能的 OCR 质量问题并建议临时解决方案(#176

  • 当输出文件位置不可写时,错误消息中会添加该路径(#175

  • 现在接受文件开头带有前导空格但其他方面有效的 PDF 文件

v5.2

  • 当使用 Tesseract 3.05.01 或更新版本时,OCRmyPDF 默认会选择“sandwich”PDF 渲染器,除非使用 --pdf-renderer 参数指定了其他渲染器。之前的行为是选择 --pdf-renderer=hocr

  • “tesseract”PDF 渲染器现已弃用,因为它可能在 Tesseract 3.05.00 上导致 Ghostscript 出现问题

  • “tess4”PDF 渲染器已重命名为“sandwich”。“tess4”现在是“sandwich”的弃用别名。

v5.1

  • 现在支持尺寸大于 200 英寸(5080 毫米)的文件,使用 --output-type=pdf 可保留页面尺寸(在 PDF 规范中此功能称为 UserUnit 缩放)。由于 Ghostscript 的限制,PDF/A 输出不提供此功能。

v5.0.1

  • 修复了 #169,在某些版本的 Tesseract 3.04(包括 jbarlow83/ocrmypdf Docker 镜像)上由于无法创建附带文本文件而导致异常

v5.0

  • 向后不兼容的变更

    • 放弃了对 Python 3.4 的支持。现在需要 Python 3.5。

    • 放弃了对 Tesseract 3.02 和 3.03 的支持。现在需要 Tesseract 3.04 或更新版本。支持 Tesseract 4.00 (alpha)。

    • 删除了 OCRmyPDF.sh 脚本。

  • 添加了一个新功能,--sidecar,允许创建包含纯文本 OCR 结果的“附带”文本文件。这些 OCR 文本比从 PDF 中提取的文本更可靠。解决了 #126

  • 新功能:--pdfa-image-compression,允许覆盖 Ghostscript 的有损或无损图像编码启发式算法,并根据需要将所有图像编码为 JPEG 或无损编码。修复了 #163

  • 修复了 #143,添加了 --quiet 以抑制“INFO”消息

  • 修复了 #164,一个拼写错误

  • 删除了命令行参数 -n--just-print,因为它们已经有一段时间不工作了(报告为 Ubuntu bug #1687308

v4.5.6

  • 修复了 #156,在没有可选 /Contents 记录的页面上出现 ‘NoneType’ 对象没有属性 ‘getObject’ 的问题。这应该能解决所有与没有 /Contents 记录的页面相关的问题。

  • 修复了 #158,ocrmypdf 现在会在 Ghostscript 在中间步骤失败时停止并终止,因为无法继续。

  • 修复了 #160,对于某些无效参数会抛出异常而不是错误消息

v4.5.5

  • macOS homebrew tap 的自动更新

  • 修复了 #154,在没有 /Contents 记录的空白页面上搜索文本时出现 KeyError ‘/Contents’。注意:此问题修复不完整。

v4.5.4

  • 修复了页面不包含图像时 --skip-big 抛出异常的问题(#152)(感谢 @TomRaz)

  • 修复了没有图像的页面可能触发“cannot write mode P as JPEG”的问题(#151

v4.5.3

  • 添加了针对 Ghostscript 9.21 及可能更早版本由于 XMP 元数据处理中的 Ghostscript 错误而导致“VMerror -25”错误消息的临时解决方案

  • 不再接受高位 Unicode 字符(U+10000 及以上)用于在命令行设置元数据,因为 Ghostscript 可能无法正确处理它们。

  • 修复了如果 tesseract 失败或超时,tess4 渲染器会复制内容到输出页面的问题

  • 修复了无损重建可能时无法识别 tess4 渲染器的问题

v4.5.2

  • 修复了 #147--pdf-renderer tess4 --clean 会生成一个超大页面,其中包含左下角的原始图像,这是由于丢失了 DPI 信息。

  • 使“使用 Tesseract 4.0”警告不那么令人担忧

  • 设置 homebrew OCRmyPDF tap 的机制

v4.5.1

  • 修复了 #137,使用 --force-ocr 和其他一些组合参数时,像素长宽比不为正方形的图像在输出中会失真

v4.5

  • 现在支持包含“Form XObjects”的 PDF(问题 #134;PDF 参考手册 8.10),并且在确定栅格化分辨率时会考虑它们包含的图像

  • Tesseract 4 Docker 镜像不再包含所有语言,因为构建时间太长,容易失败

  • OCRmyPDF 现在在使用 Tesseract 3.04 或更低版本时使用 --pdf-renderer tesseract 时会发出警告,因为在这些情况下 Ghostscript 可能损坏 OCR 文本

v4.4.2

  • Docker 镜像 (ocrmypdf, ocrmypdf-polyglot, ocrmypdf-tess4) 现在基于 Ubuntu 16.10 而不是 Debian stretch

    • 这使得支持 Tesseract 4 镜像更容易

    • 对于定制这些镜像并依赖于 Debian 而不是 Ubuntu 的 Docker 用户来说,这可能是一个破坏性变更

  • OCRmyPDF 现在会阻止运行 Tesseract 4 渲染器与 Tesseract 3.04,这在 v4.4 和 v4.4.1 中允许但将无法工作

v4.4.1

  • 为防止 img2pdf >= 0.2.1 和 Pillow <= 3.4.2 导致的 TIFF 输出错误,依赖关系已收紧

  • Tesseract 4.00 并发进程限制从 1 增加到 2,因为观察到 1 会降低性能

  • 文档改进,描述 --tesseract-config 功能

  • 添加了测试用例并修复了 --tesseract-config 的错误处理

  • 调整了 setup.py 以处理 v4.4 版本中的问题

v4.4

  • 现在实验性支持 Tesseract 4.00。

    • 新的渲染选项 --pdf-renderer tess4 利用 Tesseract 4 新的仅文本输出 PDF 模式。详情请参见 PDF 渲染器文档。

    • --tesseract-oem 参数允许控制 Tesseract 4 OCR 引擎模式(tesseract 的 --oem)。使用 --tesseract-oem 2 强制使用新的 LSTM 模式。

    • 修复了 Linux 上使用 Tesseract 4.00 性能低下问题

  • 修复了在某些情况下导致 stdout 输出损坏的问题

  • 删除了对 Pillow JPEG 和 PNG 支持的测试,因为最低支持版本 Pillow 现在强制要求此功能

  • OCRmyPDF 现在在继续之前检查目标文件是否可写

  • 测试套件现在需要 pytest-helpers-namespace 才能运行(但不需要安装)

  • 进行了重要的代码重组,使 OCRmyPDF 可重入并提高性能。对于 v4.x 系列来说,所有变更都应向后兼容。

    • 但是,OCRmyPDF 的依赖项“ruffus”是不可重入的,因此没有 Python API 可用。脚本应继续使用命令行接口。

v4.3.5

  • 更新文档以确认 Python 3.6.0 兼容性。无需代码更改,因此许多早期版本可能也支持。

v4.3.4

  • 修复了高 DPI 图像的“decimal.InvalidOperation: quantize result has too many digits”错误

v4.3.3

  • 修复了使用 Ghostscript 9.20 正确创建 PDF/A 的问题

  • 修复了内联模板遮罩缺少可选参数时的异常问题

v4.3.2

  • 修复了 Ghostscript 9.20 的 PDF/A 创建问题(注意:此修复实际上没有奏效)

v4.3.1

  • 修复了如果输入页面带有 /Rotate 标记旋转,Tesseract 超时后“hocr”渲染器生成的页面旋转不正确的问题

  • 修复了 LeptonicaErrorTrap 中的文件句柄泄漏问题,当使用 --deskew--remove-background 或其他基于 Leptonica 的图像处理功能时,对于大约几百页长的文件,根据系统 ulimit -n 的值,会导致“打开文件过多”错误

  • 文档中现在宣传了为多语言文档指定多种语言的能力

  • 减小了一些测试资源的文件大小

  • 清理了调试输出

  • 测试用例中的 Tesseract 缓存现在对假缓存命中更加谨慎,并努力重现精确输出,尽管没有观察到任何问题

v4.3

  • 新功能 --remove-background 用于检测并擦除彩色和灰度图像的背景

  • 更好的文档

  • 修复了栅格堆栈深度为零时绘制图像的 PDF 的问题

  • ocrmypdf 现在可以将其输出重定向到 stdout,以便在 shell 管道中使用

    • 这并不能提高性能,因为仍使用临时文件进行缓冲

    • 在此模式下,某些输出验证被禁用

v4.2.5

  • 修复了 #100,图像上省略可选 /BitsPerComponent 参数的 PDF 的问题

  • 删除了非免费文件 milk.pdf

v4.2.4

  • 修复了由正确使用模板遮罩的 PDF 引起的错误(#90

  • 修复了处理未正确设置图形状态就尝试绘制图像或模板遮罩的 PDF 的问题(此类图像现在在计算 DPI 时被忽略)

v4.2.3

  • 修复了将页面旋转(/Rotate)存储在间接对象中的 PDF 的问题

  • 集成了一些修复,以简化下游打包 (Debian)

    • 测试套件不再假设已安装

    • 如果在 Linux 上运行,跳过在命令行上传递 Unicode 的测试

  • 添加了测试用例以检查显式遮罩和模板遮罩

  • 添加了间接对象和线性化 PDF 的测试用例

  • 弃用了 OCRmyPDF.sh shell 脚本

v4.2.2

  • 改进了文档

v4.2.1

  • 修复了包含模板遮罩的 PDF 页面报告不正确 DPI 并导致 Ghostscript 中止的问题

  • 实现了 stdin 流

v4.2

  • 如果输入为单个图像文件,ocrmypdf 现在会尝试将其转换为 PDF(#15

    • 这是一个基础便捷功能。它仅支持单个图像,并且总是使图像填充整个页面。

    • 要更好地控制图像到 PDF 的转换,请使用 img2pdf(ocrmypdf 的一个依赖项)

  • 新参数 --output-type {pdf|pdfa} 允许禁用 Ghostscript PDF/A 生成

    • pdfa 是默认值,与过去的行为一致

    • pdf 为那些担心 Ghostscript 强制将 JBIG2 图像转换为 CCITT 和转码 JPEG 导致文件大小增加的用户提供了临时解决方案

    • pdf 会尽可能多地保留原始文件的内容,包括 PDF/A 转换修复的问题

  • 现在可以正确处理包含具有“非方形”像素长宽比(例如 200x100 DPI)的图像的 PDF,并正确转换(修复了导致裁剪的错误)

  • --force-ocr 会栅格化页面,即使它们不包含图像

    • 支持希望使用 OCRmyPDF 在 Unicode 映射损坏的 PDF 中重建文本信息的用户(复制粘贴的文本与显示文本不匹配)

    • 支持重新解释文本被渲染为曲线以用于打印,并且需要恢复文本的 PDF

    • 修复问题 #82

  • 修复了一个问题,在某些设置下,PDF 中的单色图像会转换为 8 位灰度图像,从而增加文件大小(#79

  • 已放弃对 Ubuntu 12.04 LTS “precise” 的支持,转而支持(大致)Ubuntu 14.04 LTS “trusty”

    • 需要一些 Ubuntu “PPAs”(回溯)才能使其工作

  • 放弃了对一些旧依赖项的支持

    • 现在需要 Ghostscript 9.15 或更高版本(在带有回溯的 Ubuntu trusty 中可用)

    • 现在需要 Tesseract 3.03 或更高版本(在 Ubuntu trusty 中可用)

  • Ghostscript 现在尽可能在“更安全”模式下运行

v4.1.4

  • 错误修复:附带 ICC 配置文件的单色图像如果因其他设置无法进行无损重建,则会被错误地转换为全彩图像;结果是这些图像的文件大小增加

v4.1.3

  • 对于使用版本 4 安全处理程序的 PDF,提供更有帮助的错误消息

  • 更新 Windows/Docker 用户的用法说明

  • 修复了矩阵乘法的运算顺序(对大多数用户没有影响)

  • 添加了一些 leptonica 包装函数(对大多数用户没有影响)

v4.1.2

  • 将 IEC sRGB ICC 配置文件替换为 Debian 的 sRGB(来自 icc-profiles-free),后者与 MIT 许可证更兼容

  • 对于某些格式错误的 PDF 相关的错误,提供更有帮助的错误消息

v4.1

  • --rotate-pages 现在仅在方向相当确定时旋转页面。此行为可以通过新参数 --rotate-pages-threshold 进行调整

  • 修复了运行时卸载或缺少 unpaper 时的错误检查问题

  • 修复了错误处理期间出现“RethrownJobError”错误抑制有用错误消息的问题

v4.0.7

  • 对 Ghostscript 输出设置的微小修正

v4.0.6

  • 更新安装说明

  • 提供 sRGB 配置文件而不是使用 Ghostscript 的

v4.0.5

  • 从 v4.0.4 中移除了一些冗长的调试消息

  • 修复了未被删除的临时文件

  • 现在可以正确计算裁剪图像以及其他图像转换的 DPI

  • 内联图像现在在计算 DPI 时进行检查,而不是拒绝图像

v4.0.4

发布时启用了冗长的调试消息。请勿使用。跳到 v4.0.5。

v4.0.3

新功能

  • 检测到的页面方向现在在摘要注释中报告

修复

  • 如果发生意外错误,显示堆栈跟踪

  • 将 Tesseract 的“字符太少”错误消息视为跳过该页面而不是中止文件

  • Docker:通过坚持使用修复了此问题的 Ghostscript 版本来修复空白 JPEG2000 问题

v4.0.2

修复

  • 修复了与 Tesseract 3.04.01 版本的兼容性,特别是其不同的输出方向信息方式

  • 改进了对 Tesseract 错误和崩溃的处理

  • 修复了 Docker 上 chmod 的使用导致大多数测试用例失败的问题

v4.0.1

修复

  • 修复了如果 Tesseract 未能找到页面方向信息时出现 KeyError 的问题

v4.0

新功能

  • 现在提供自动页面旋转(-r)。它会忽略 PDF 上任何先前的旋转信息,并根据可检测文本的主要方向设置旋转。此功能相当可靠,但有时会出现误报,特别是文本不多时。(#4

  • 现在使用 Leptonica 而不是 unpaper 进行倾斜校正。Leptonica 在图像倾斜校正方面比 unpaper 更快、更可靠。

修复

  • 修复了一个问题,即如果在扫描后在 Acrobat 中由用户旋转了页面(特别是如果带有 /Rotate 标记),无损重建可能会导致某些页面显示不正确

  • 修复了一个问题,即如果页面被裁剪以致其原点不是 (0, 0),无损重建可能会导致图形层与文本层错位(#49

变更

  • 日志输出现在更容易阅读

  • --deskew 现在由 Leptonica 执行而不是 unpaper(#25

  • 现在需要 libffi

  • Docker 和 Travis 构建环境进行了一些更改以支持 libffi

  • 如果 Tesseract 版本低于 3.04.01(计划发布的修复了 Tesseract 3.04.00 中重要的 OCR 文本渲染错误的版本),--pdf-renderer=tesseract 现在会显示警告。您也可以手动将 ./share/sharp2.ttf 安装到 Tesseract tessdata 文件夹中的 pdf.ttf 上来解决问题。

v3.2.1

变更

  • 通过升级到 img2pdf 0.2 修复了 #47“convert() got and unexpected keyword argument ‘dpi’”的问题

  • 调整了 Dockerfile

v3.2

新功能

  • 无损重建:如果可能,OCRmyPDF 将注入文本层,而不会改变 PDF 页面的内容和布局。例如,包含矢量和栅格内容的 PDF 将保留矢量内容。在 PDF/A 转换过程中,图像仍可能被转码。(--deskew--clean-final 必然会禁用此模式。)

  • 新参数 --tesseract-pagesegmode 允许您将页面分割参数传递给 Tesseract OCR。这有助于处理双栏文本和其他让 Tesseract 困惑的情况。

  • 添加了一个新的“polyglot”版本的 Docker 镜像,该镜像生成了安装所有语言包的 Tesseract,适合我们当中的多语种用户。它体积更大。

变更

  • JPEG 转码质量现在是 95,而不是默认的 75。文件大小更大,但降级更少。

v3.1.1

变更

  • 修复了导致混合页面尺寸文档页面尺寸和 DPI 计算不正确的 bug

v3.1

变更

  • 默认输出格式现在是 PDF/A-2b 而不是 PDF/A-1b

  • Python 3.5 和 macOS El Capitan 现在是支持的平台 - 无需更改代码即可实现支持

  • 改进了关于缺少输入文件的错误消息

  • 修复了 #20:不接受大写 .PDF 扩展名

  • 修复了 OCRmyPDF 未能检测到某些页面包含先前已进行 OCR 的文本(例如,Tesseract 3.04 生成的 OCR 文本)的问题

  • 将 /Creator 标签插入 PDF,以便错误可以追溯到本项目

  • 添加了新选项 --pdf-renderer=auto,让 OCRmyPDF 选择最佳 PDF 渲染器。目前它总是选择 'hocrtransform' 渲染器,但此行为将来可能改变。

  • 设置 Travis CI 自动集成测试

v3.0

新功能

  • 使用 Docker 容器或 Python 的 pip 包管理器安装更容易

  • 消除了许多外部依赖项,设置更容易

  • 现在将 ocrmypdf 安装到 /usr/local/bin 或等效位置,以便系统范围访问和更轻松的输入

  • 改进了命令行语法和用法帮助(--help

  • 可以改用 Tesseract 3.03+ PDF 页面渲染,以获得更好的识别文本定位(--pdf-renderer tesseract

  • PDF 元数据(标题、作者、关键词)现在转移到输出 PDF

  • 也可以从命令行设置 PDF 元数据(--title 等)

  • 如果可能,自动修复格式错误的输入 PDF

  • 添加了测试用例以确认一切正常工作

  • 添加了选项以跳过处理时间过长且通常无法进行 OCR 的超大页面(例如大型扫描地图或图表);其他页面仍然处理(--skip-big

  • 添加了选项,如果 Tesseract OCR 进程在某个页面上花费时间过长,可以终止该进程,同时仍处理其他页面(--tesseract-timeout

  • 通过转换为 RGB,现在支持不常见的颜色空间(CMYK、调色板)

  • 现在支持同一 PDF 页面上的多个图像

变更

  • 在 Python 3.4+ 中使用 ruffus 管道进行了全新且强大的重写

  • 现在使用 Ghostscript 9.14 改进的颜色转换模型来保留 PDF 颜色

  • OCR 文本现在在 PDF 中渲染为不可见文本。OCRmyPDF 的先前版本错误地将可见文本与顶部图像一起渲染。

  • 管道中的所有“任务”都可以在任何可用的 CPU 上并行执行,从而提高性能

  • -o DPI 参数已被逐步淘汰,取而代之的是 --oversample DPI,以备将来需要 -o OUTPUTFILE

  • 删除了几个依赖项,因此更容易安装。我们不再使用

  • 与 v2.x 相比,需要或可选一些新的外部依赖项

    • Ghostscript 9.14+

    • qpdf 5.0.0+

    • Unpaper 6.1 (可选)

    • 一些自动管理的 Python 包

发布候选版本^

  • rc9

    • 修复 #118:如果 ghostscript iccprofiles 丢失,报告错误

    • 修复了与 #111 相关的另一个问题:PDF 栅格化为调色板文件

    • 增加对带有调色板的图像文件的支持

    • 发生异常后不尝试验证 PDF 文件

  • rc8

    • 修复 #111:如果 PDF 缺少 DocumentInfo 字典,则抛出异常

  • rc7

    • 修复直接从 pip 安装时的错误,“无此文件 ‘requirements.txt’”

  • rc6

    • 弃用 libxml2 (Python lxml),因为 Python 3 的内部 XML 解析器已足够

    • 设置 Docker 容器

    • 如果识别的文本包含 Unicode 字符且系统区域设置不是 UTF-8,则修复 Unicode 错误

  • rc5

    • 弃用 Java 和 JHOVE,改用 qpdf

    • 改进了命令行错误输出

    • 额外的测试和错误修复

    • 在 Ubuntu 14.04 LTS 上测试

  • rc4

    • 弃用 MuPDF,改用 qpdf

    • 修复了一些安装程序问题和安装说明中的错误

    • 提高性能:使用多线程渲染运行 Ghostscript

    • 提高性能:默认使用多个核心

    • 错误修复:检查进程超时时抛出错误的异常

  • rc3:特意跳过版本号以避免与 Tesseract 混淆

  • rc2:第一个面向公共测试的版本,发布到 test-PyPI, Github

  • rc1:测试发布流程

兼容性说明

  • ./OCRmyPDF.sh 脚本目前仍然可用

  • 不再支持堆叠冗余选项,例如 -vvv

  • 配置文件 config.sh 已被删除。相反,您可以将文件作为参数传递以设置常用配置

ocrmypdf input.pdf output.pdf @settings.txt

其中 settings.txt 每行包含一个参数,例如

-l
deu
--author
A. Merkel
--pdf-renderer
tesseract

修复

  • 处理包含空格的文件名:已修复

注意事项和已知问题

  • 某些依赖项可能与测试的版本较低的版本兼容,因此如果它们“碍事”,请尝试覆盖依赖项以查看它们是否工作。

  • 由于 Tesseract 的一个错误,--pdf-renderer tesseract 在 Tesseract 3.03 中输出的文件页面尺寸不正确。

  • 不兼容包含“内联图像”的 PDF 文件,并且在 3.0 版本中也不会支持。扫描图像几乎不包含内联图像。

v2.2-stable (2014-09-29)

OCRmyPDF 1 和 2 版本是作为 shell 脚本实现的。OCRmyPDF 3.0+ 是一个分支,逐渐用 Python 替换了所有 shell 脚本,同时保留了现有的命令行参数。目前没有人维护旧版本。

有关旧版本的详细信息,请参阅其发布说明的最终版本