以下の PDFMiner 本家 issue で、同様の事を考え自己解決されている方がいらっしゃいますね。
https://github.com/euske/pdfminer/issues/172
重要な点は、 PDF でのリンクが HTML のようにテキストの属性としてではなく、 文書の特定の座標位置に対するアノテーションとして実装されている ことかと思います。そのため、リンク自体は次のようにして PDFPage.annots
を参照すれば得られるのですが、対応するテキストがすぐには得られません。
※ Subtype == 'Link'
なアノテーションの処理は、 このへん が参考になると思います
python
1from pdfminer.pdftypes import resolve1
2
3found_links = []
4
5for annot in resolve1(page.annots):
6 annot = resolve1(annot)
7
8 if annot['Subtype'].name == 'Link' and 'A' in annot:
9 link_info = resolve1(annot['A'])
10
11 if 'URI' in link_info:
12 found_links.push(
13 {
14 'uri': link_info['URI'],
15 'bbox': annot['Rect'],
16 }
17 )
そこで前掲の issue では、 PDFPage.mediabox
にアノテーションの Rect を上書きして、ページサイズを無理やりアノテーションと同じサイズまで制限してからパースすることで、比較的お手軽にその領域のテキストを吐き出させているようでした。処理速度が気にならず、文書内のテキストとの密接な関係が必要ない場合はこれで良いかもしれません (例えば、同じ文字列に対するリンクが複数存在した場合、どちらかわからなくても良い場合) 。ただ、オリジナルの pdfminer
用の hack なので、pdfminer3k
では動かないかもしれません。
今回は、 LTText.get_text()
を使ってテキストを取得なさっているようなので、そのまま LTComponent.bbox
を参照し、事前に取得した各リンクアノテーションの Rect と比較しながら処理していけば、文書中の位置と正しく対応させながらリンクURL が取得できると思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。