假设我有一个包含许多 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 {}