如何从PDF中提取突出显示的文本?

2024-10-05 22:04:49 发布

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

thisthisthis问题的解决方案显示了如何提取弹出式便笺/便笺和突出显示的文本区域中的注释。但是,我还没有找到一个解决方案,如何提取突出显示的文本本身。是否可以使用Python(或bash、Unix命令行工具,或其他直接且不太大而无法安装的命令行解决方案)?

到目前为止,我已经尝试了PyPDF2python-poppler-qt5。有了PyPDF2,我可以得到我怀疑可以用来从页面中提取文本区域的四点或矩形区域,但是我根本无法让p2.extractText()工作,所以不知道如何继续:

import PyPDF2 as pp2

pdf_file = open('sample.pdf', 'rb')
pdf = pp2.PdfFileReader(pdf_file)
p2 = pdf.getPage(2)
p2['/Annots'][4].getObject()

输出:

    {'/Type'{'/Type': '/Annot',
     '/Subtype': '/Highlight',
     '/Subj':'Highlight',
     '/T': 'joel',
     '/F': 4,
     '/NM': 'b3a6d3a3-bdab-457b-a769-9d82e616798a',
     '/CreationDate': 'D:20190704104139',
     '/CA': 1,
     '/Rect': [58.9415, 184.958, 550.855, 235.086],
     '/C': [0.99608, 0.99608, 0.68235],
     '/QuadPoints': [430.769,
      219.662,
      550.304,
      219.662,
      430.769,
      235.086,
      550.304,
      235.086,
      58.9415,
      202.585,
      531.575,
      202.585,
      58.9415,
      218.56,
      531.575,
      218.56,
      59.4924,
      185.509,
      313.437,
      185.509,
      59.4924,
      201.483,
      313.437,
      201.483],
     '/AP': {'/N': {'/Subtype': '/Form',
       '/FormType': 1,
       '/BBox': [0, 0, 491.914, 50.1278],
       '/Resources': {'/ExtGState': {'/TransGs': {'/CA': 1,
          '/ca': 1,
          '/BM': '/Multiply',
          '/Type': '/ExtGState'}}},
       '/Group': {'/S': '/Transparency', '/Type': '/Group'},
       '/Filter': '/FlateDecode'}},
     '/M': "D:20190704104139+00'00'",
     '/Contents': 'sample text written on highlighted area'}

使用python-poppler-qt5,我还可以获得突出显示区域的边界,但是当我尝试从该区域提取文本时,将返回空字符串:

import popplerqt5                                                                              
d = popplerqt5.Poppler.Document.load('sample.pdf')                                                          
p2 = d[2]                                                                                      
a = p2.annotations()                                                                           
t = a[4]
p2.text(t.boundary())  # Returns an empty string.

我目前的解决方案是使用Zotero和zotfile来实现这一点(via pdf.js),但是当我有多个pdf时,这有点乏味,所以如果可能的话,我希望自动化这个过程。


Tags: sample命令行文本import区域pdftype解决方案