完全披露,我是pdfminer.six 的维护者之一。它是用于 python 3 的 pdfminer 的社区维护版本。
现在,pdfminer.six 有多个 API 可以从 PDF 中提取文本和信息。对于以编程方式提取信息,我建议使用extract_pages()。这允许您检查页面上的所有元素,这些元素按布局算法创建的有意义的层次结构排序。
以下示例是显示层次结构中所有元素的 Python 方式。它使用 pdfminer.six 的示例目录中的simple1.pdf。
from pathlib import Path
from typing import Iterable, Any
from pdfminer.high_level import extract_pages
def show_ltitem_hierarchy(o: Any, depth=0):
"""Show location and text of LTItem and all its descendants"""
if depth == 0:
print('element fontname text')
print('------------------------------ -------------------- -----')
print(
f'{get_indented_name(o, depth):<30.30s} '
f'{get_optional_fontinfo(o):<20.20s} '
f'{get_optional_text(o)}'
)
if isinstance(o, Iterable):
for i in o:
show_ltitem_hierarchy(i, depth=depth + 1)
def get_indented_name(o: Any, depth: int) -> str:
"""Indented name of class"""
return ' ' * depth + o.__class__.__name__
def get_optional_fontinfo(o: Any) -> str:
"""Font info of LTChar if available, otherwise empty string"""
if hasattr(o, 'fontname') and hasattr(o, 'size'):
return f'{o.fontname} {round(o.size)}pt'
return ''
def get_optional_text(o: Any) -> str:
"""Text of LTItem if available, otherwise empty string"""
if hasattr(o, 'get_text'):
return o.get_text().strip()
return ''
path = Path('~/Downloads/simple1.pdf').expanduser()
pages = extract_pages(path)
show_ltitem_hierarchy(pages)
输出显示层次结构中的不同元素、字体名称和大小(如果可用)以及该元素包含的文本。
element fontname text
------------------------------ -------------------- -----
generator
LTPage
LTTextBoxHorizontal Hello
LTTextLineHorizontal Hello
LTChar Helvetica 24pt H
LTChar Helvetica 24pt e
LTChar Helvetica 24pt l
LTChar Helvetica 24pt l
LTChar Helvetica 24pt o
LTChar Helvetica 24pt
LTAnno
LTTextBoxHorizontal World
LTTextLineHorizontal World
LTChar Helvetica 24pt W
LTChar Helvetica 24pt o
LTChar Helvetica 24pt r
LTChar Helvetica 24pt l
LTChar Helvetica 24pt d
LTAnno
LTTextBoxHorizontal Hello
LTTextLineHorizontal Hello
LTChar Helvetica 24pt H
LTChar Helvetica 24pt e
LTChar Helvetica 24pt l
LTChar Helvetica 24pt l
LTChar Helvetica 24pt o
LTChar Helvetica 24pt
LTAnno
LTTextBoxHorizontal World
LTTextLineHorizontal World
LTChar Helvetica 24pt W
LTChar Helvetica 24pt o
LTChar Helvetica 24pt r
LTChar Helvetica 24pt l
LTChar Helvetica 24pt d
LTAnno
LTTextBoxHorizontal H e l l o
LTTextLineHorizontal H e l l o
LTChar Helvetica 24pt H
LTAnno
LTChar Helvetica 24pt e
LTAnno
LTChar Helvetica 24pt l
LTAnno
LTChar Helvetica 24pt l
LTAnno
LTChar Helvetica 24pt o
LTAnno
LTChar Helvetica 24pt
LTAnno
LTTextBoxHorizontal W o r l d
LTTextLineHorizontal W o r l d
LTChar Helvetica 24pt W
LTAnno
LTChar Helvetica 24pt o
LTAnno
LTChar Helvetica 24pt r
LTAnno
LTChar Helvetica 24pt l
LTAnno
LTChar Helvetica 24pt d
LTAnno
LTTextBoxHorizontal H e l l o
LTTextLineHorizontal H e l l o
LTChar Helvetica 24pt H
LTAnno
LTChar Helvetica 24pt e
LTAnno
LTChar Helvetica 24pt l
LTAnno
LTChar Helvetica 24pt l
LTAnno
LTChar Helvetica 24pt o
LTAnno
LTChar Helvetica 24pt
LTAnno
LTTextBoxHorizontal W o r l d
LTTextLineHorizontal W o r l d
LTChar Helvetica 24pt W
LTAnno
LTChar Helvetica 24pt o
LTAnno
LTChar Helvetica 24pt r
LTAnno
LTChar Helvetica 24pt l
LTAnno
LTChar Helvetica 24pt d
LTAnno
(类似的答案
here,
here 和
here
,我会尽量让它们保持同步。)