我有大量文件,其中一些是将图像扫描成 PDF,一些是完整/部分文本 PDF。
有没有一种方法可以检查这些文件以确保我们只处理扫描图像文件而不是完整/部分文本 PDF 文件?
环境:Python 3.6
原文由 Jinu Joseph 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有大量文件,其中一些是将图像扫描成 PDF,一些是完整/部分文本 PDF。
有没有一种方法可以检查这些文件以确保我们只处理扫描图像文件而不是完整/部分文本 PDF 文件?
环境:Python 3.6
原文由 Jinu Joseph 发布,翻译遵循 CC BY-SA 4.0 许可协议
基于 Rahul Agarwal 的解决方案 以及我在 此链接 中找到的一些片段,这里有一个可能的算法可以解决您的问题。
您需要安装 fitz
和 PyMuPDF
模块。您可以通过 pip
来完成。
以下代码已使用 Python 3.7.9 和 PyMuPDF
1.16.14 进行了测试。此外,重要的是安装 fitz
之前 PyMuPDF
,否则它会提供一些关于缺少前端模块的奇怪错误(不知道为什么)。所以这是我安装模块的方式:
pip3 install fitz
pip3 install PyMuPDF==1.16.14
这是 Python 3 的实现:
import fitz
def get_text_percentage(file_name: str) -> float:
"""
Calculate the percentage of document that is covered by (searchable) text.
If the returned percentage of text is very low, the document is
most likely a scanned PDF
"""
total_page_area = 0.0
total_text_area = 0.0
doc = fitz.open(file_name)
for page_num, page in enumerate(doc):
total_page_area = total_page_area + abs(page.rect)
text_area = 0.0
for b in page.getTextBlocks():
r = fitz.Rect(b[:4]) # rectangle where block text appears
text_area = text_area + abs(r)
total_text_area = total_text_area + text_area
doc.close()
return total_text_area / total_page_area
if __name__ == "__main__":
text_perc = get_text_percentage("my.pdf")
print(text_perc)
if text_perc < 0.01:
print("fully scanned PDF - no relevant text")
else:
print("not fully scanned PDF - text is present")
尽管这回答了您的问题(即区分完全扫描和完整/部分文本 PDF),但此解决方案无法区分全文本 PDF 和其中也包含文本的扫描 PDF(例如,处理的扫描 PDF 就是这种情况通过 OCR 软件 - 例如 pdfsandwich 或 Adobe Acrobat - 在图像顶部添加“不可见”文本块,以便您可以选择文本)。
原文由 Vito Gentile 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
4 回答1.5k 阅读✓ 已解决
3 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
2 回答915 阅读✓ 已解决
1 回答1.8k 阅读✓ 已解决
下面的代码将起作用,从可搜索和不可搜索的 PDF 中提取数据文本数据。
如果你没有
fitz
模块,你需要这样做:pip install --upgrade pymupdf