这是一个老问题,但似乎很多人都在关注它(包括我在尝试回答这个问题时),所以我分享了我想出的答案。附带说明一下,学习如何使用 Python 调试器 (pdb) 很有帮助,因此您可以即时检查这些对象。
可以使用 PDFMiner 获取超链接。复杂之处在于(就像很多关于 PDF 的情况一样),链接注释和链接文本之间实际上没有任何关系,只是它们都位于页面的同一区域。
这是我用来在 PDFPage 上获取链接的代码
annotationList = []
if page.annots:
for annotation in page.annots.resolve():
annotationDict = annotation.resolve()
if str(annotationDict["Subtype"]) != "/Link":
# Skip over any annotations that are not links
continue
position = annotationDict["Rect"]
uriDict = annotationDict["A"].resolve()
# This has always been true so far.
assert str(uriDict["S"]) == "/URI"
# Some of my URI's have spaces.
uri = uriDict["URI"].replace(" ", "%20")
annotationList.append((position, uri))
然后我定义了一个函数,如:
def getOverlappingLink(annotationList, element):
for (x0, y0, x1, y1), url in annotationList:
if x0 > element.x1 or element.x0 > x1:
continue
if y0 > element.y1 or element.y0 > y1:
continue
return url
else:
return None
我用来搜索之前在页面上找到的 annotationList,以查看是否有任何超链接与我在页面上检查的 LTTextBoxHorizontal 占用相同的区域。
在我的例子中,由于 PDFMiner 在文本框中合并了太多文本,我浏览了每个文本框的 _objs 属性并查看了所有 LTTextLineHorizontal 实例,看看它们是否与任何注释位置重叠。