Pdfminer.six从PDF文件提取文本、图片、元数据

Pdfminer.six 是 PDFMiner 的一个分支。

它是一种从 PDF 中解析、提取信息的工具文件,侧重于获取和分析文本数据、元数据和图片,还可用于获取文本的确切位置、字体或颜色。Pdfminer.six 直接从页面中提取文本 PDF 的源代码。以模块化的方式构建,因此 pdfminer.six 的每个组件都可以轻松更换。特征

  • 完全用 Python 编写。
  • 解析、分析和转换 PDF 文档。
  • 将内容提取为文本、图像、html 或 hOCR。
  • 支持 PDF-1.7 规范。
  • 支持 CJK 语言和垂直书写脚本。
  • 支持各种字体类型(Type1、TrueType、Type3 和 CID)。
  • 支持提取图像(JPG、JBIG2、位图)。
  • 支持各种压缩(ASCIIHexDecode、ASCII85Decode、LZWDecode、FlateDecode、RunLengthDecode、 CCITTFaxDecode)
  • 支持 RC4 和 AES 加密。
  • 支持 AcroForm 交互式表单提取。
  • 目录提取。
  • 标记内容提取。
  • 自动布局分析。

    Pdfminer.six 从 PDF 文件提取文本、图片、元数据

环境要求:Python 3.8 或更高版本。

安装 pdfminer.six


pip install pdfminer.six

(可选)安装用于提取图像的额外依赖项。


pip install 'pdfminer.six[image]'

使用方式

1.使用命令行界面从 pdf 中提取文本。


pdf2txt.py example.pdf

2.与 Python 一起使用。


from pdfminer.high_level import extract_text

text = extract_text("example.pdf")
print(text)

使用案例

  1. 解析 pdf 文档

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
 
# 打开 PDF 文件
with open('example.pdf', 'rb') as file:
    # 创建一个 PDFParser 对象
    parser = PDFParser(file)
 
    # 创建一个 PDFDocument 对象
    document = PDFDocument(parser)
 
    # 检查文档是否被加密
    if document.is_extractable:
        # 获取文档的布局数据
        layout = document.layout
        print("布局数据:", layout)
 
        # 获取文档的元数据
        metadata = document.info
        print("元数据:", metadata)

2.提取文本内容



from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
 
# 打开 PDF 文件
with open('example.pdf', 'rb') as file:
    # 创建一个 PDFResourceManager 对象
    resource_manager = PDFResourceManager()
 
    # 创建一个 StringIO 对象,用于存储提取的文本内容
    output = StringIO()
 
    # 创建一个 TextConverter 对象
    converter = TextConverter(resource_manager, output, laparams=LAParams())
 
    # 创建一个 PDFPageInterpreter 对象
    interpreter = PDFPageInterpreter(resource_manager, converter)
 
    # 逐页解析文档
    for page in PDFPage.get_pages(file):
        interpreter.process_page(page)
 
    # 获取提取的文本内容
    text = output.getvalue()
    print(text)

3.提取图片



from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdftypes import PDFStream
import io
 
# 打开 PDF 文件
with open('example.pdf', 'rb') as file:
    # 创建一个 PDFParser 对象
    parser = PDFParser(file)
    document = PDFDocument(parser)
 
    # 检查文档是否被加密
    if document.is_extractable:
        # 获取文档中的所有图片
        for xref in document.xrefs:
            if xref.get_subtype() == '/Image':
                stream_obj = xref.get_object()
 
                if isinstance(stream_obj, PDFStream):
                    # 获取图片的原始字节
                    data = stream_obj.get_rawdata()
 
                    # 将字节转换为图像
                    image = Image.open(io.BytesIO(data))
                    image.show()

4.提取元素


from pdfminer.high_level import extract_pages

for page_layout in extract_pages("example.pdf"):
    for element in page_layout:
        print(element)

5.提取 form 表单数据



from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdftypes import resolve1
from pdfminer.psparser import PSLiteral, PSKeyword
from pdfminer.utils import decode_text


data = {}


def decode_value(value):

    # decode PSLiteral, PSKeyword
    if isinstance(value, (PSLiteral, PSKeyword)):
        value = value.name

    # decode bytes
    if isinstance(value, bytes):
        value = decode_text(value)

    return value


with open(file_path, 'rb') as fp:
    parser = PDFParser(fp)

    doc = PDFDocument(parser)
    res = resolve1(doc.catalog)

    if 'AcroForm' not in res:
        raise ValueError("No AcroForm Found")

    fields = resolve1(doc.catalog['AcroForm'])['Fields']  # may need further resolving

    for f in fields:
        field = resolve1(f)
        name, values = field.get('T'), field.get('V')

        # decode name
        name = decode_text(name)

        # resolve indirect obj
        values = resolve1(values)

        # decode value(s)
        if isinstance(values, list):
            values = [decode_value(v) for v in values]
        else:
            values = decode_value(values)

        data.update({name: values})

        print(name, values)

运行结果将打印所有字段的名称和值,并将它们保存在“data”字典中。

参考文档
https://pdfminersix.readthedocs.io/en/latest/index.html

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...