尚未进行OCR处理的PDF文件批量OCR处理

4

如果我有10,000个PDF文件,其中一些已经进行了OCR处理,而另一些只有1页进行了OCR处理,但其他页面没有进行过处理,那么我该如何浏览所有的PDF文件,并仅对尚未进行OCR处理的页面进行OCR处理呢?


你可能会发现这个相关问题有帮助。 - Tobias Kienzler
4个回答

8

这正是我一直在寻找的,我有数千个扫描的PDF文件,其中一些已经进行了OCR处理,而另一些没有。

因此,我结合了在论坛和Stack Overflow上找到的信息,并制作了自己的解决方案,完全符合我的需求。下面是我总结的步骤:

  • 递归扫描所有子目录中的PDF文件;
  • 检查PDF文件是否已经进行了OCR处理,如果没有,则使用高质量的OCR处理程序以指定的语言进行处理;
  • 将OCR PDF文件“原地”保存为PDF/A格式,并覆盖旧的(未进行OCR处理的)PDF文件。

我使用的是Windows 10系统,无法找到明确的答案。我尝试使用Acrobat Pro进行操作,但遇到了许多错误,并且Acrobat的批量处理会停止在每个错误或受密码保护的文件上。我还尝试了许多其他Windows批量OCR工具,但效果都不理想。我花费了无数小时手动检查哪些文件已经有了“图像下”的文本层。

直到!微软宣布现在可以在同一台计算机、同一文件系统下很容易地在Windows下运行Linux。Linux上有比Windows更多的工具和实用程序,所以我想尝试一下。

所以,下面是步骤:

  1. 在Windows控制面板中启用“Windows子系统”;有很多指南。可以使用Google搜索。这需要几分钟时间。
  2. 从Windows商店安装Linux。打开Windows商店,搜索Ubuntu,并安装。大约需要5分钟时间。
  3. 现在你有了“Ubuntu应用程序”。运行它。它会显示Linux bash,并通过/mnt/c访问你的Windows文件。这很神奇!
  4. 你需要一些Linux“应用程序”,即pdffontsocrmypdf;可以使用命令sudo apt install pdffontssudo apt install ocrmypdf来安装它们。我们将使用这些应用程序来检查PDF文件是否有嵌入字体,如果没有,则进行OCR处理(请参见下面的注释)。
  5. 将下面的非常小的bash脚本安装到你的主目录~。
  6. 进入(cd)保存所有PDF文件的目录。例如:/mnt/c/Users/name/OneDrive/Documents
  7. 执行以下命令:find . -type f -name "*.pdf" -exec /your/homedir/pdf-ocr.sh '{}' \;

完成!

运行此命令可能需要很长时间,具体取决于你有多少PDF文件以及其中有多少没有进行OCR处理。

以下是 sh 脚本,您应该将其保存在您的主文件夹中,以便随时可以调用。步骤如下:

  1. 输入 cd ~ 命令,进入主文件夹。
  2. 输入 pico pdf-ocr.sh 命令,打开编辑器。将以下脚本代码粘贴到编辑器中。然后按 Ctrl+X 键,再按 Y 键。文件已成功保存。
  3. 输入 sudo chmod +x pdf-ocr.sh 命令,赋予脚本运行权限。
MYFONTS=$(pdffonts -l 5 "$1" | tail -n +3 | cut -d' ' -f1 | sort | uniq)
if [ "$MYFONTS" = '' ] || [ "$MYFONTS" = '[none]' ]; then
    echo "Not yet OCR'ed: $1 -------- Processing...."
        echo " "
        ocrmypdf -l eng+deu+nld -s "$1" "$1"
        echo " "
else
    echo "Already OCR'ed: $1"
echo " "
fi

这个脚本是做什么的?

好的,find 命令会查找当前目录及其子目录中的所有 PDF 文件,并将这些文件“发送”到脚本中。在脚本中,pdffonts 会检查是否有嵌入字体。如果有,则跳过该文件并尝试下一个文件。如果未找到嵌入字体,则使用 ocrmypdf 进行OCR处理。 我发现ocrmypdf的 OCR 质量非常好,甚至比 Acrobat 的还要好。当然,您可以调整设置。例如,您可能希望使用其他语言进行 OCR,而不是 eng+deu+nld。您可以在此处查看所有选项:https://ocrmypdf.readthedocs.io/en/latest/

注意:我做出了这样的假设,即如果一个 PDF 文件没有嵌入字体(因此基本上是一个PDF文件中的图像(扫描)),那么它就没有经过OCR。我知道这可能不总是准确和/或正确的,但对我来说,已足以确定哪些文件需要通过OCR。因此,不必重新处理数百或数千个PDF文件....

我知道在 Windows 下安装 Linux 有点麻烦,但只要您拥有基本的 Linux 技能,这很容易。对我来说,这值得一试,因为现在我已经制作了一个“单击”批处理器,并且运行良好。我找不到使用 Windows 工具解决此问题的解决方案。

我希望有人能发现并发现这很有用。如果有人有改进,请在此处发布。

谢谢。

Jos Jonkeren


在我的情况下(Windows 10,Ubuntu 20.04),无法通过“sudo apt install pdffonts”安装pdfffonts。我不得不通过“apt install poppler-utils”来安装它。 - sn1ks

1

为什么不重新OCR一遍呢?你花在反复工作上的时间可能超过了工作本身所需的时间。


0

重新启动这个线程。

您可以通过使用pdffonts来测试它们来知道哪些PDF文件已经被OCR处理过。如果有嵌入字体,则很可能PDF已经被OCR处理过。

至于批量处理,我编写了一个小脚本,可以批量将OCR转换为pdf/word/excel/csv输出格式。

您可以在https://github.com/deajan/pmOCR找到它。 pmOCR(贫民OCR)是Abbyy OCR CLI for linux或Tesseract 3开源解决方案的包装器。


0
如果你所说的OCRed是指文本以机器可读形式存在,那么你可以使用像Apache PDFBox这样的库来尝试从文档的第二页中提取文本。如果它抛出错误或返回垃圾数据,那么它很可能不是OCRed。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接