Это старый вопрос, но, похоже, многие люди смотрят на него (включая меня, когда я пытаюсь ответить на этот вопрос), поэтому я делюсь ответом, который придумал. В качестве примечания: очень полезно научиться использовать отладчик 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
который я использовал для поиска списка аннотаций, который я ранее нашел на странице, чтобы увидеть, занимает ли какая-либо гиперссылка ту же область, что и LTTextBoxHorizontal, который я проверял на странице.
В моем случае, поскольку PDFMiner объединял слишком много текста в текстовом поле, я просмотрел атрибут _objs каждого текстового поля и просмотрел все экземпляры LTTextLineHorizontal, чтобы увидеть, не перекрывают ли они какие-либо позиции аннотаций.
person
Shawn Dyer
schedule
02.04.2018