如何自动查找不可搜索的 PDF

如何自动查找不可搜索的 PDF

假设我有一个包含许多 PDF 的目录。其中大多数 PDF 的文本都是完全可搜索的,这正是我需要的。但其中一些只是图像扫描,需要进行 OCR 处理。

除了简单地对整个目录进行批量 OCR 之外,还有其他方法可以快速识别哪些 PDF 是真正需要进行 OCR 的纯图像 PDF 吗?

我不是一名程序员,但我更喜欢适合 Linux 的解决方案。

答案1

我不确定这是否是一个 100% 的解决方案,但我提出了以下脚本,即使不是全部,它也应该能为您提供很大一部分帮助(我没有看过规范)它应该从包含所有 PDF 的目录运行(它将搜索子目录)。

#! /bin/bash

if [[ ! "$#" = "1" ]]
  then
      echo "Usage: $0 /path/to/PDFDirectory"
      exit 1
fi

PDFDIRECTORY="$1"

while IFS= read -r -d $'\0' FILE; do
    PDFFONTS_OUT="$(pdffonts "$FILE" 2>/dev/null)"
    RET_PDFFONTS="$?"
    FONTS="$(( $(echo "$PDFFONTS_OUT" | wc -l) - 2 ))"
    if [[ ! "$RET_PDFFONTS" = "0" ]]
      then
          READ_ERROR=1
          echo "Error while reading $FILE. Skipping..."
          continue
    fi
    if [[ "$FONTS" = "0" ]]
      then
          echo "NOT SEARCHABLE: $FILE"
      else
          echo "SEARCHABLE: $FILE"
    fi
done < <(find "$PDFDIRECTORY" -type f -name '*.pdf' -print0)

echo "Done."
if [[ "$READ_ERROR" = "1" ]]
  then
      echo "There were some errors."
fi

它的工作原理是查找每个 PDF 中指定的字体数量。如果文件没有任何字体,则假定它仅由图像组成。(这可能会在受密码保护的文件上出错,我不知道,也没有可以测试的文件)。如果有些内容是可搜索的,有些内容是图像,则此方法不起作用 - 但将 PDF 容器中的扫描图像文档与“真实”PDF 分开可能会很有用。

当然,如果您只想打印出不可搜索的文件,您可以注释掉 if-then-else 循环中不适用的部分。

答案2

我将使用一个技巧,我注意到一个奇怪的次要事实,如果pdf文件没有任何字体,它通常是不可搜索的。因此,了解这一点后,我们可以使用pdffonts

前两行pdffonts是表头,因此当一个文件可搜索时会有超过两行的输出,知道了这一点我们可以创建:

gedit check_pdf_searchable.sh

然后粘贴此

#!/bin/bash 
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1" # alternatively you can use ocrmypdf "$1" "${1}_ocr.pdf"
fi

然后使其可执行

chmod +x check_pdf_searchable.sh

然后列出目录中所有不可搜索的 pdf:

ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}

或者在目录及其子目录中:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}

相关内容