Skip to main content

OCRUSREX 采用 PDF(通过路径或作为类似文件的对象)并使用 Tesseract 4 使其可搜索。它具有企业友好型许可证。

项目描述

它有什么作用?

OCRUSREX 是一个简单、简洁的 Python 3 库,用于获取 PDF(通过路径或作为类似文件的对象),将其转换为图像,通过 Tesseract 4 运行并将其作为 PDF 返回。

为什么另一个 OCR 库?

Python 中有几个用于 OCR PDF 的优秀软件包,但它们的许可对于在企业应用程序中的潜在使用可能存在问题。此外,其中许多具有比我需要或想要的更多的功能。我只需要一些东西来获取 PDF、OCR 并把它还给我,而没有其他选项的开销和潜在的许可问题。

安装

pip install ocrusrex

除了安装所需的 python 依赖项之外,您还需要 tesseract v4。您还需要安装适当的训练数据。OCRUSREX 配置为使用“最佳”英语 LSTM 训练数据集。您可以通过覆盖 tesseract_config 参数来更改此配置以使用快速或标准质量。根据我的基准测试,使用最佳可将准确率提高约 1 - 3 个百分点,每页的性能提升约 20%。在 VirtualBox 开发环境中,这意味着使用字节 obj 输入和输出时每页从 2 秒到 2.38 秒(字符串路径要慢得多)。我愿意进行权衡,因为我讨厌重新 OCR 的东西,但你的里程可能会有所不同。

如果您想使用 tesseract 的“最佳”训练集,您可能需要为您的系统安装它。请参阅 Tesseract Docs 中对不同 Tesseract 模型的描述:

依赖项

生产

OCRUSREX 依赖于四个核心库,都具有类似 MIT 的许可证:

  1. pytesseract (麻省理工学院)
  2. PyPDF2(类似 MIT)
  3. 枕头(类似麻省理工学院)
  4. uqfoundation/多进程(类似 MIT)

显然,您需要已经安装了 Tesseract 4。请参阅 Tesseract 文档(或 pytesseract 文档)。

测试

测试还依赖于:

  1. python-levenshtein
  2. 蒂卡蟒蛇。

核心库都不需要工作。

用法

单线程
from OCRUSREX import ocrusrex
ocrusrex.OCRPDF(source="", targetPath=None, page=None, nice=5, verbose=False, tesseract_config='--oem 1 -l eng -c preserve_interword_spaces=1 textonly_pdf=1')

RETURNS:如果任务失败则返回 fasly,如果成功则返回truthy。如果指定 targetPath,则返回 True 表示成功或返回 false 表示失败。如果您未指定 targetPath,则在成功时返回字节 obj 或在失败时返回 None。

多线程

OCRUSREX 通过核心 Python 3 多线程库支持多线程执行。根据初步测试,此执行模式使您能够将每页与单线程的 OCR 时间除以您指定的线程数。例如,假设您有必要的核心数,运行线程=4 会将每页的 ocr 时间除以 4,从而有效地将 OCR 时间减少 75%。多线程性能几乎与运行单独的进程相同。这可能是由于 OCRUSREX 总是调用单独的 tesseract 实例,因此无论您选择多线程还是多进程执行,它都会有效地调用单独的进程。

from OCRUSREX import ocrusrex
ocrusrex.Multithreaded_OCRPDF(source="", targetPath=None, processes=4, nice=5, verbose=False, tesseract_config='--oem 1 -l eng -c preserve_interword_spaces=1 textonly_pdf=1')

RETURNS:如果任务失败则返回 fasly,如果成功则返回truthy。如果指定 targetPath,则返回 True 表示成功或返回 false 表示失败。如果您未指定 targetPath,则在成功时返回字节 obj 或在失败时返回 None。

多处理

OCRUSREX 通过 uqfoundation/multiprocess 库支持多进程执行。根据初步测试,此执行模式使您能够将每页与单线程的 OCR 时间除以您指定的进程数。例如,假设您有必要的内核数,运行 processes=4 会将每页的 ocr 时间除以 4,从而有效地将 OCR 时间减少 75%。将来可能会删除此方法,因为与使用多线程相比,它似乎没有提供真正的性能优势,但它是以额外的依赖为代价的。

from OCRUSREX import ocrusrex
ocrusrex.Multiprocessed_OCRPDF(source="", targetPath=None, threads=4, nice=5, verbose=False, tesseract_config='--oem 1 -l eng -c preserve_interword_spaces=1 textonly_pdf=1')

RETURNS:如果任务失败则返回 fasly,如果成功则返回truthy。如果指定 targetPath,则返回 True 表示成功或返回 false 表示失败。如果您未指定 targetPath,则在成功时返回字节 obj 或在失败时返回 None。

选项:
  • processes = 4 [仅限多处理]

    • 一次应该产生多少个进程?默认值为 4。初始指导不应超过您的有效核心数。
  • 线程= 4 [仅多线程]

    • 一次应该使用多少个线程。默认值为 4。因为线程会产生新的 tesseract 实例,所以多线程性能与多进程非常相似。
  • 来源= ""

    • 要 OCRed 的目标 PDF 是什么?这可以是包含 pdf 或类似文件对象的有效路径的字符串。
  • 目标路径= 无

    • OCRed PDF 应该保存在哪里?如果您不提供值,则 pdf 将作为字节对象返回。
  • page = None [仅单线程]

    • 如果您提供一个整数值,则只有一个页面会被 OCRed 并返回。如果您将此保留为无,则整个 PDF 将被 OCRed。PDF 页面起始索引 # 是 1 NOT 0
  • 不错= 5

    • 在类 Unix 操作系统中设置线程的优先级。5 略有升高。
  • 详细= 假

    • 如果设置为 True,则在控制台中显示消息。
  • tesseract_config = '--oem 1 --psm 6 -l best/eng -c preserve_interword_spaces=1'

    • 这将作为配置选项传递给 pytesseract。如果您直接调用它,这些是您将直接传递给 tesseract 的命令行参数。此处的默认值已针对准确性进行了优化,但需要您下载额外的 tesseract 数据文件(“最佳”文件)。这是以牺牲速度为代价的。
  • tesseract_config = '打印'

    • 为此参数传递一个方法,以将详细的 OCR 消息作为第一个参数传递给此函数。如果将其保留为 None,则使用标准 print() 函数。
  • 记录器= 无

    • 如果您想传入特定的记录器以公开内部详细消息(特别是对于多线程和多处理版本),请在此处传入记录器对象。它必须支持 .info 和 .error 调用。如果将其保留为 None,verbose 将使用标准 Python print() 函数。

未来

我对此时的基线性能非常满意。该工具可以以每 2 秒 1 页的速度对 PDF 进行 OCR。

最重要的下一个功能是减小输出文件的大小。输出 PDF 目前比源文件大得多。我需要做一些实验,看看这是否可以在将高质量图像输入 Tesseract 之后完成。

在那之后,做更多的错误检查和其他自动清理会很好。那里的其他库有大量的代码库,专门用于这些类型的清理任务。现在,我希望我会随着时间的推移有机地添加这些类型的功能,因为我发现需要解决的特别棘手的情况或者我需要为自己提供某种类型的输出。欢迎投稿!

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

OCRUSREX-0.2.2.tar.gz (6.5 kB 查看哈希

已上传 source

内置分布

OCRUSREX-0.2.2-py3-none-any.whl (7.4 kB 查看哈希

已上传 py3