对this,this和this问题的解决方案显示了如何提取在弹出/便签和突出显示的文本区域中所作的注释。但是,我还没有找到有关如何提取突出显示的文本本身的解决方案。是否可以使用Python(或bash,Unix命令行工具或其他直接的且安装不太大的其他命令行解决方案)来实现?
到目前为止,我已经尝试使用PyPDF2
和python-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时,这有点乏味,所以我希望在可能的情况下实现自动化。