如何区分数字创建的PDF和可搜索的PDF?

2024-09-25 00:34:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在分析一组PDF文件。我想知道有多少PDF文件属于这三类:

  • 数字创建的PDF:文本存在(可复制),并保证其正确性,因为它是直接创建的,例如从Word创建的
  • 仅图像PDF:扫描的文档
  • 可搜索PDF:扫描的文档,但使用了OCR引擎。OCR引擎将文本放在图像的“下方”,以便您可以搜索/复制内容。由于OCR非常好,大多数情况下这是正确的。但这并不能保证是正确的

在我的域中很容易识别仅图像PDF,因为每个PDF都包含文本。如果我不能提取任何文本,它只是图像。但是,我如何知道它是“仅仅”一个可搜索的PDF,还是一个数字化创建的PDF

顺便说一句,这并不像我看到的扫描文档中制作人字段上写着“MicrosoftWord”那样简单

注意:作为一个人,这很容易。我只是放大文本。如果我看到像素,它“只是”可搜索

以下是测试解决方案的3个示例PDF文件:

我的努力/想法

  • 使用创建者/制作人:我在扫描的文档中看到“Microsoft Word”。这也会很乏味
  • 嵌入式字体:您可以extract embedded fonts。当时的想法是,扫描的文档不会嵌入字体,而是使用默认字体。从这个例子可以看出,这个想法是错误的

Tags: 文件文档图像引擎文本内容pdf字体
3条回答

How to check if PDF is scanned image or contains text修改this answer

在这个解决方案中,您不必渲染pdf,因此我猜它会更快。基本上,我修改的答案使用文本覆盖的pdf区域的百分比来确定它是文本文档还是扫描文档(图像)

我添加了一个类似的推理,计算图像覆盖的总面积来计算图像覆盖的百分比。如果它大部分被图像覆盖,您可以假定它是扫描的文档。您可以移动阈值以适应文档集合

我还添加了逻辑来逐页检查。这是因为至少在我拥有的文档集合中,一些文档可能有一个数字创建的第一页,然后扫描其余的页面

修改代码:

import fitz #pip install PyMuPDF

def page_type(page):

    page_area =abs(page.rect) #total page area

    img_area=0.0
    for block in page.getText("RAWDICT")["blocks"]:
        if block["type"]==1: #Type=1 are images
            bbox=block["bbox"]
            img_area+=(bbox[2]-bbox[0])*(bbox[3]-bbox[1]) # width*height
    img_perc=img_area / page_area
    print("Image area proportion: "+str(img_perc))

    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)
    text_perc=text_area / page_area
    print("Text area proportion: "+str(text_perc))

    if text_perc < 0.01: #No text = Scanned
        page_type="Scanned"
    elif img_perc > .8:  #Has text but very large images = Searchable
        page_type="Searchable text" 
    else:
        page_type="Digitally created"
    return page_type


doc=fitz.open(pdffilepath)

for page in doc: #Iterate through pages to find different types
    print(page_type(page))

您可以通过bash脚本来完成

    #!/bin/bash

    echo "shellscript $0"
    ls  color  group-directories-first
    read -p "Is it OK to use this shellscript in this directory? (y/N) " ans
    if [ "$ans" != "y" ]
    then
     exit
    fi

    mkdir -p scanned
    mkdir -p text
    mkdir -p "s-and-t"

    for file in *.pdf
    do
     grep -aq '/Image/' "$file"
     if [ $? -eq 0 ]
     then
      image=true
     else
      image=false
     fi
     grep -aq '/Text' "$file"
     if [ $? -eq 0 ]
     then
      text=true
     else
      text=false
     fi


     if $image && $text
     then
      mv "$file" "s-and-t"
     elif $image
     then
      mv "$file" "scanned"
     elif $text
     then
      mv "$file" "text"
     else
      echo "$file undecided"
     fi
    done    

谢谢

使用PyMuPDF,您可以轻松删除@ypnos建议所需的所有文本

另一种选择是,使用PyMuPDF,您还可以检查文本是否隐藏在PDF中。在PDF的相关“迷你语言”中,这是由命令3 Tr(“文本呈现模式”,例如,参见第402页,共https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf)触发的。 因此,如果所有文本都受此命令的影响,则不会呈现任何文本,从而得出“这是一个OCR页面”的结论

相关问题 更多 >