首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何区分数字创建的PDF和可搜索的PDF?

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

Stack Overflow用户
提问于 2020-08-19 20:51:27
回答 3查看 2.5K关注 0票数 11

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

  • 数字创建PDF:文本在那里(可复制),并保证它是正确的,因为它是直接创建的,例如从Word创建的
  • 只有图像的PDF:扫描文档
  • 可搜索PDF:扫描文档,但使用OCR引擎。OCR引擎将文本放在图像“下面”,以便搜索/复制内容。由于OCR相当不错,这在大多数情况下是正确的。但这并不一定是正确的。

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

顺便说一句,它并不像我看到的扫描文档那样简单,生产者字段说的是"Microsoft“。

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

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

  • 数字化创建PDF
  • 扫描PDF:嗯..。不完全是这样;我使用脚本来创建图像,然后将它们合并成PDF格式。但这只意味着质量很好。它应该和扫描非常相似。
  • 可搜索PDF

我试过/想过的

  • 使用创建者/生产者:我在扫描文档中看到"Microsoft“。而且,这将是乏味的。
  • 嵌入式字体:您可以提取嵌入式字体。这样做的想法是,扫描后的文档不会有嵌入式字体,而只是使用默认的字体。从这个例子可以看出,这个想法是错误的。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-20 14:47:52

使用PyMuPDF,您可以很容易地删除@ypnos建议所需的所有文本。

作为另一种选择,使用PyMuPDF,您还可以检查文本是否隐藏在PDF中。在PDF的相关“迷你语言”中,这是由命令3 Tr (“文本呈现模式”,例如,参见1-7.pdf的402页)触发的。因此,如果所有文本都受此命令的影响,则不会呈现任何文本--允许得出“这是一个OCR‘’ed页面”的结论。

票数 3
EN

Stack Overflow用户

发布于 2021-06-11 14:21:35

这个答案如何检查PDF是否扫描图像或包含文本的改进

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

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

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

修改后的代码:

代码语言:javascript
复制
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))
票数 3
EN

Stack Overflow用户

发布于 2020-10-14 14:50:09

你可以通过bash脚本来完成。

代码语言:javascript
复制
    #!/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    

谢谢

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63494812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档