【问题标题】:Issues with PyMuPDF extracting plain textPyMuPDF 提取纯文本的问题
【发布时间】:2018-06-04 14:05:32
【问题描述】:

我想使用PyMuPDF 阅读 PDF 文件。我只需要纯文本(无需提取颜色、字体、表格等信息)。

我已经尝试了以下

import fitz
from fitz import TextPage
ifile = "C:\\user\\docs\\aPDFfile.pdf"
doc = TextPage(ifile)
>>> TypeError: in method 'new_TextPage', argument 1 of type 'struct fz_rect_s *'

哪个不行,所以我尝试了

doc = fitz.Document(ifile)
t = TextPage.extractText(doc)
>>> AttributeError: 'Document' object has no attribute '_extractText'

这又不起作用了。

然后,我从 PyMuPDF 的一位作者那里找到了一个 great blog,其中包含有关从文件中按读取顺序提取文本的详细代码。但每次我使用不同的 PDF 运行此代码时,我都会得到 KeyError: 'lines'(代码中的第 81 行)或 KeyError: "bbox"(代码中的第 60 行)。

我不能在此处发布 PDF,因为它们是机密的,我很感激这里有这些有用的信息。但是有什么方法可以让我完成 PyMuPDF 要做的最简单的任务:从 PDF 中提取纯文本,无序或其他方式(我不太介意)?

【问题讨论】:

  • 在访问该键之前,请检查您要查找的键(例如,linesbbox)是否在字典中(例如,块)。

标签: python pdf pymupdf


【解决方案1】:

按照您的示例使用 PyMuPDF 提取文本的过程是:

import fitz

filepath = "C:\\user\\docs\\aPDFfile.pdf"

text = ''
with fitz.open(filepath ) as doc:
    for page in doc:
        text+= page.getText()
print(text)

你关注的博客很棒,但是有点过时了,有些方法已经贬值了。

【讨论】:

    【解决方案2】:

    来自 repo 维护者的消息:

    提取纯文本但仍至少进行基本排序的最简单方法是

    blocks = page.getText("blocks")
    blocks.sort(key=lambda block: block[1])  # sort vertically ascending
    
    for b in blocks:
        print(b[4])  # the text part of each block
    

    【讨论】:

      【解决方案3】:
      import fitz
      
      filepath = "C:\\user\\docs\\aPDFfile.pdf"
      
      text = ''
      with fitz.open(filepath ) as doc:
          for page in doc:
              text+= page.get_text()
      
      print(text)
      

      【讨论】:

      • 请记住,Stack Overflow 不仅仅是为了解决眼前的问题,而是为了帮助未来的读者找到类似问题的解决方案,这需要了解底层代码。这对于我们社区的初学者和不熟悉语法的成员来说尤其重要。鉴于此,您能否edit 您的答案包括对您正在做什么的解释以及为什么您认为这是最好的方法?
      猜你喜欢
      • 2022-08-05
      • 2021-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多