如何在 PDF 和图像上执行服务器端 OCR

介绍

光学字符识别或OCR主要用于将扫描图像中的文本转换为可选、可复制、可编码、嵌入的文本. 许多现代桌面和移动应用程序和扫描软件堆栈都内置了一些OCR功能,而大多数流行的PDF都嵌入文本。

在这种情况下,您可以使用开源工具的管道自动执行OCR,这尤其有用,如果您正在将文档或图像注入到需要提取文本的Web应用程序中,或者如果您正在与需要索引其完整文本的大型文档集一起工作。

本教程将涵盖使用 Ghostscript, TesseractPDFtk设置 OCR 管道。

前提条件

此教程将为 Ubuntu 22.04 服务器提供安装说明,遵循我们的指南 初始服务器设置与 Ubuntu 22.04

步骤 1 – 安装 Ghostscript、Tesseract 和 PDFtk

OCR 可在 PDF(包含并有时被渲染为图像)和独立图像上执行。

您将需要三种工具来完成端到端的管道: Ghostscript,它处理各种形式的 PDF 到图像转换,反之亦然(它最初是为 Postscript 创建的,这是 PDF 的先驱技术), Tesseract,是一个开源的 OCR 引擎,就像 Ghostscript 一样,自20世纪80年代以来一直在不断开发,以及 PDFtk,一个更小的工具来从单个页面切割或重建 PDF。

所有三种应用都可在Ubuntu的默认存储库中安装,并可通过apt包管理器安装。

1sudo apt update
2sudo apt install pdftk ghostscript tesseract-ocr x11-utils

您现在应该有三个新的命令,一个为每个应用程序,您可以通过使用哪个来验证:

1which pdftk
1[secondary_label Output]
2/usr/bin/pdftk
1which gs
1[secondary_label Output]
2/usr/bin/gs
1which tesseract
1[secondary_label Output]
2/usr/bin/tesseract

您将使用这些命令在下一个步骤中执行OCR。

步骤 2 – 将 PDF 转换为图像并运行 Tesseract

如果您还没有想要执行OCR的PDF文件,您可以通过下载 此样本PDF来跟随本教程,该文件没有任何嵌入文本,而已被扫描。

1curl -O https://deved-images.nyc3.digitaloceanspaces.com/server-ocr/OCR-sample-paper.pdf

如果您正在使用一个或多个 PDF 文件,则需要将其转换为单个图像,然后可以用作 OCR 源。这可以通过 Ghostscript 命令进行。您需要包含额外的参数来保持围绕 DPI, 颜色空间和尺寸的一致性。 首先,为创建此过程的文件创建一个工作输出目录,然后运行gs:

1mkdir output
2gs -o output/%05d.png -sDEVICE=png16m -r300 -dPDFFitPage=true OCR-sample-paper.pdf

这个gs命令在命令的其余部分之前指定输出路径,使用-o旗帜。%05d是Ghostscript本地理解的模糊的壳语法,在这种情况下,它意味着使用自动增加的5位数字命名输出PNG文件从输入PDF中。

Ghostscript将单独输出PDF中的每个页面:

1[secondary_label Output]
2Processing pages 1 through 14.
3Page 1
4Page 2
5Page 3
6Page 4
7Page 5
8

完成后,您可以检查输出目录的内容。

1ls output
1[secondary_label Output]
200001.png 00003.png 00005.png 00007.png 00009.png 00011.png 00013.png
300002.png 00004.png 00006.png 00008.png 00010.png 00012.png 00014.png

接下来,您将使用一个 shell 环绕一个 tesseract 命令,将您创建的图像转换为单个 PDF 页面,这次包含嵌入式文本。

1for png in $(ls output); do tesseract -l eng output/$png output/$(echo $png | sed -e "s/\.png//g") pdf; done

某些文本将输出到您的壳,而命令正在循环:

1[secondary_label Output]
2Tesseract Open Source OCR Engine v4.1.1 with Leptonica
3Tesseract Open Source OCR Engine v4.1.1 with Leptonica
4Tesseract Open Source OCR Engine v4.1.1 with Leptonica
5Tesseract Open Source OCR Engine v4.1.1 with Leptonica
6...

Tesseract 语法本身就是这个组件: tesseract -l 语言 input_filename output_base_filename [pdf]. 如果错过了 -l 语言 组件,Tesseract 将默认为英语语言模型,如果错过了 pdf,Tesseract 将从输入图像中单独输出识别文本,而不是作为 PDF。

<$>[注] 注: 在Ubuntu上,Tesseract 默认情况下不会安装每个语言模型. 如果您需要执行非英语 OCR,您应该安装 tesseract-ocr-all包,其中包含sudo apt install tesseract-ocr-all

您可以在 官方文档中找到更多 Tesseract 命令行示例。

运行 Tesseract 后再次检查输出目录:

1ls output

您将看到所有新创建的PDF页面。

1[secondary_label Output]
200001.pdf 00003.pdf 00005.pdf 00007.pdf 00009.pdf 00011.pdf 00013.pdf
300001.png 00003.png 00005.png 00007.png 00009.png 00011.png 00013.png
400002.pdf 00004.pdf 00006.pdf 00008.pdf 00010.pdf 00012.pdf 00014.pdf
500002.png 00004.png 00006.png 00008.png 00010.png 00012.png 00014.png

如果您只需要一个输出图像,您可以跳过本教程的最后步骤,了解更多关于大量文本提取选项。

步骤 3 (可选) – 从图像输出重新构建 PDF

如果您在最后一步中使用了 PDF 作为输入,那么您现在需要使用 PDFtk 和 Ghostscript 再次将其从 Tesseract 制作的单个页面中重新组合起来. 因为它们是序列编号的,您可以使用壳语法将列表列表的文件传递到pdftk cat命令中,以便将它们连接在一起:

1pdftk output/*.pdf cat output joined.pdf

您现在从 Tesseract 输出中重建了单个 PDF,名为joined.pdf。唯一剩余的步骤是使用 Ghostscript 重建 PDF. 这很重要,因为 Tesseract 并不总是忠于准确的 PDF 尺寸。 您的新 PDF 目前比您的输入大得多,因为它没有被优化,而 Ghostscript 是重新渲染 PDF 到准确的规格的更强大的工具。 运行joined.pdf上的最后一个gs命令:

1gs -sDEVICE=pdfwrite -sPAPERSIZE=letter -dFIXEDMEDIA -dPDFFitPage -o final.pdf joined.pdf

您可能会收到关于 PDF spec 合规性的警告输出,这是正常的。Ghostscript 对于 PDF 标准比其他工具更具要求,大多数 PDF 都会在大多数观众中进行渲染。

所有参数 -sDEVICE=pdfwrite -sPAPERSIZE=letter -dFIXEDMEDIA -dPDFFitPage 都用于执行 PDF 尺寸. 如果您正在使用不同的页面格式,您可能需要更改 `sPAPERSIZE=letter'。

要测试您的 OCR 是否成功,您可以在桌面应用程序中本地打开 PDF,或者您可以使用命令行应用程序(如pdftotext)从文档中卸载现在嵌入的文本。

您可以通过名为poppler-utils的包在Ubuntu上安装pdftotext,该包包含几个工具,用于在命令行上处理PDF:

1sudo apt install poppler-utils

接下来,在你的新 PDF 上运行pdftotext:

1pdftotext final.pdf

将创建一个新的文件,即final.txt。预览此文件的内容,使用一个工具,如head:

1head final.txt
 1[secondary_label Output]
 2Pakistan Journal of Applied Economics (1983) vol. II, no. 2 (167180)
 3
 4THE MEASUREMENT OF FARM-SPECIFIC
 5TECHNICAL EFFICIENCY
 6K. P. KALIRAJAN and J. C, FLINN*
 7
 8Measures of technical efficiency were estimated using a stochastic translog
 9production frontier for a sample of rainfed rice farmers in Bicol, Philippines.
10These estimates were farm specific as opposed to being based on deviations
11from an average sample efficiency. A wide variation in the level of technical

您应该从输入文件中接收文本的流程. 它可能不顺序或包含一些奇怪的格式化字符,但当您将文本同时卸载时,这是很自然的 - 重要的是文档现在包含嵌入式文本。

您现在可以使用三种工具和四种命令使用端到端的 PDF OCR 管道。这些可以合并成一个独立的脚本,集成到另一个应用程序中,或根据需要进行交互式运行。这对于单个 PDF 文档是一个完整的解决方案。

步骤 4 (可选) – 在 OCR 后从文档中提取 CSV 表

在对图像或 PDF 执行 OCR 后,您可以选择将任何表格或表格格式的数据提取到 CSV 文件中,这在使用较旧的数据源或科学论文时尤其有用。

提供此功能的工具有两种,它们都以类似的方式运作: Tabula,用Java写,和 Camelot,用Python写。

标签

Tabula 可以通过使用snap install在 Ubuntu 上作为快递包安装:

1sudo snap install tabula

如果您视觉检查本教程中使用的样本PDF,您将在6页中间找到一张表:

Sample of table-formatted text

因此,您将在 PDF 上运行,指定您希望在您的final.pdf中从-p 6中提取表格,并将输出重定向到名为test.csv的新文件:

1tabula -p 6 final.pdf > test.csv

test.csv中检查表检测的质量,现在您应该能够将其用作表程序(如 Excel)或其他数据分析脚本的输入。

骆驼

Camelot 是一个 Python 库,需要您安装 Python 和 Python 包管理器 pip. 如果您尚未安装 Python,您可以参阅 [如何在 Ubuntu 22.04 服务器上安装 Python 3 和设置编程环境] 的第一步(https://andsky.com/tech/tutorials/how-to-install-python-3-and-set-up-a-programming-environment-on-an-ubuntu-22-04-server)。

接下来,安装pip install的Camelot,以及其opencv依赖:

1sudo pip install camelot-py opencv-python-headless ghostscript

之后,您可以在 PDF 上运行camelot,再次指定-p 6,输出路径和文件类型,以及输入final.pdf:

1camelot -p 6 -f csv -o test.csv stream final.pdf

您可以参阅 Camelot 文档以便在需要时精简提取。

在本教程的最后一个可选步骤中,您将审查一些其他OCR解决方案。

步骤5(可选) – 使用其他OCR解决方案进行批量提取

虽然Tesseract是最长时间开发的开源OCR工具,并支持最广泛的输出格式,但还有一些其他选项可用于执行服务器侧OCR。 EasyOCR是一个更新的开源OCR引擎,更积极地开发,可以通过运行GPU提供更快或更准确的结果。

EasyOCR 是一个 Python 库,需要您安装 Python 和 Python 包管理器 pip. 如果您尚未安装 Python,您可以参阅 [如何在 Ubuntu 22.04 服务器上安装 Python 3 和设置编程环境] 的第一步(https://andsky.com/tech/tutorials/how-to-install-python-3-and-set-up-a-programming-environment-on-an-ubuntu-22-04-server)。

接下来,用pip install安装 EasyOCR:

1sudo pip install easyocr

安装 EasyOCR 后,您可以将其用作 Python 脚本中的库,或者您可以使用easyocr命令直接从命令行调用。

1easyocr -l ch_sim en -f image.jpg --detail=1 --gpu=True

EasyOCR 支持同时加载多种语言模型以执行多语言 OCR. 您可以根据-l 旗帜指定多个语言,在这种情况下ch_sim为简化中文和en为英语。 -f image.jpg 是输入文件的路径。 --detail=1 将提供边界框坐标以及输出,如果您需要参考文件中提取文本的位置。

「-gpu=True」旗是可选的,如果已配置 GPU 环境,则将尝试使用 CUDA代码路径进行更高效的提取。

结论

在本教程中,您使用几种成熟的开源工具创建了一个OCR管道,可以实现到其他应用程序堆栈或通过Web服务曝光,您还审查了这些工具可用的部分语法和选项,用于精细调节,并考虑了一些其他OCR选项,用于提取CSV表和运行大规模大批量文本提取。

OCR是一种被广泛理解和使用的技术:你知道什么时候需要它,尽管如此,转钥匙的OCR实现往往仅限于付费的桌面软件,随时随地部署OCR工具可以非常有用。

Published At
Categories with 技术
Tagged with
comments powered by Disqus