如何检查PDF是扫描图像还是包含文本

新手上路,请多包涵

我有大量文件,其中一些是将图像扫描成 PDF,一些是完整/部分文本 PDF。

有没有一种方法可以检查这些文件以确保我们只处理扫描图像文件而不是完整/部分文本 PDF 文件?

环境:Python 3.6

原文由 Jinu Joseph 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.9k
2 个回答

下面的代码将起作用,从可搜索和不可搜索的 PDF 中提取数据文本数据。

 import fitz

text = ""
path = "Your_scanned_or_partial_scanned.pdf"

doc = fitz.open(path)
for page in doc:
    text += page.getText()

如果你没有 fitz 模块,你需要这样做:

pip install --upgrade pymupdf

原文由 Rahul Agarwal 发布,翻译遵循 CC BY-SA 4.0 许可协议

基于 Rahul Agarwal 的解决方案 以及我在 此链接 中找到的一些片段,这里有一个可能的算法可以解决您的问题。

您需要安装 fitzPyMuPDF 模块。您可以通过 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 软件 - 例如 pdfsandwichAdobe Acrobat - 在图像顶部添加“不可见”文本块,以便您可以选择文本)。

原文由 Vito Gentile 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题