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

时间:2019-07-04 20:50:14

标签: python pdf

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

到目前为止,我已经尝试使用PyPDF2python-poppler-qt5。使用PyPDF2,我可以得到我怀疑可以用于从页面提取文本区域的QuatPoints或Rect区域,但是我根本无法使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与可以完全做到这一点(via pdf.js)的zotfile一起使用,但是当我有多个PDF时,这有点乏味,所以我希望在可能的情况下实现自动化。

0 个答案:

没有答案