PDFminer:使用其字体信息提取文本

ari*_*tll 8 python text-extraction pdfminer

我发现这个问题,但它使用命令行,我不想使用子进程在命令行中调用Python脚本并解析HTML文件以获取字体信息.

我想使用PDFminer作为库,我发现这个问题,但它们只是提取纯文本,没有其他信息,如字体名称,字体大小等.

Pie*_*ter 7

完全披露,我是pdfminer.6的维护者之一。它是 pdfminer for python 3 的社区维护版本。

如今,pdfminer.6 有多个 API 可以从 PDF 中提取文本和信息。对于以编程方式提取信息,我建议使用extract_pages(). 这允许您检查页面上的所有元素,这些元素按布局算法创建的有意义的层次结构排序。

以下示例是显示层次结构中所有元素的 Python 方式。它使用pdfminer.6 的示例目录中的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)
Run Code Online (Sandbox Code Playgroud)

输出显示层次结构中的不同元素、字体名称和大小(如果可用)以及该元素包含的文本。

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                                      
Run Code Online (Sandbox Code Playgroud)

(类似的答案 在这里这里这里 ,我会尽力让它们保持同步。)


Emi*_*ova 5

#!/usr/bin/env python
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.layout import LAParams
from pdfminer.converter import PDFPageAggregator
import pdfminer


def createPDFDoc(fpath):
    fp = open(fpath, 'rb')
    parser = PDFParser(fp)
    document = PDFDocument(parser, password='')
    # Check if the document allows text extraction. If not, abort.
    if not document.is_extractable:
        raise "Not extractable"
    else:
        return document


def createDeviceInterpreter():
    rsrcmgr = PDFResourceManager()
    laparams = LAParams()
    device = PDFPageAggregator(rsrcmgr, laparams=laparams)
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    return device, interpreter


def parse_obj(objs):
    for obj in objs:
        if isinstance(obj, pdfminer.layout.LTTextBox):
            for o in obj._objs:
                if isinstance(o,pdfminer.layout.LTTextLine):
                    text=o.get_text()
                    if text.strip():
                        for c in  o._objs:
                            if isinstance(c, pdfminer.layout.LTChar):
                                print "fontname %s"%c.fontname
        # if it's a container, recurse
        elif isinstance(obj, pdfminer.layout.LTFigure):
            parse_obj(obj._objs)
        else:
            pass


document=createPDFDoc("/tmp/simple.pdf")
device,interpreter=createDeviceInterpreter()
pages=PDFPage.create_pages(document)
interpreter.process_page(pages.next())
layout = device.get_result()


parse_obj(layout._objs)
Run Code Online (Sandbox Code Playgroud)

  • 这适用于获取字体名称,但不适用于获取字体大小或其他属性(斜体、粗体等) (2认同)

gpl*_*yer 1

看看PDFlib,它可以根据您的需要提取字体信息,并且有一个 Python 库,您可以在脚本中导入并使用它。