使用Pdfminer.six从PDF中提取文本、图片和元数据的完整指南

Pdfminer.six是PDFMiner的一个分支,它是一款强大的工具,专注于解析和提取PDF文档中的信息,包括文本、元数据和图片。该工具以模块化的方式构建,使得每个组件都可以轻松更换,提供了广泛的特性和功能,使用户能够灵活地处理PDF文档。

特性:

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

<code>from pdfminer.high_level import extract_text</code><code><br></code><code>text = extract_text("example.pdf")</code><code>print(text)</code>

使用案例

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

2.提取文本内容

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

3.提取图片

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

4.提取元素

<code>from pdfminer.high_level import extract_pages</code><code><br></code><code>for page_layout in extract_pages("example.pdf"):</code><code> for element in page_layout:</code><code> print(element)</code>

5.提取form表单数据

<code>from pdfminer.pdfparser import PDFParser</code><code>from pdfminer.pdfdocument import PDFDocument</code><code>from pdfminer.pdftypes import resolve1</code><code>from pdfminer.psparser import PSLiteral, PSKeyword</code><code>from pdfminer.utils import decode_text</code><code><br></code><code><br></code><code>data = {}</code><code><br></code><code><br></code><code>def decode_value(value):</code><code><br></code><code> # decode PSLiteral, PSKeyword</code><code> if isinstance(value, (PSLiteral, PSKeyword)):</code><code> value = value.name</code><code><br></code><code> # decode bytes</code><code> if isinstance(value, bytes):</code><code> value = decode_text(value)</code><code><br></code><code> return value</code><code><br></code><code><br></code><code>with open(file_path, 'rb') as fp:</code><code> parser = PDFParser(fp)</code><code><br></code><code> doc = PDFDocument(parser)</code><code> res = resolve1(doc.catalog)</code><code><br></code><code> if 'AcroForm' not in res:</code><code> raise ValueError("No AcroForm Found")</code><code><br></code><code> fields = resolve1(doc.catalog['AcroForm'])['Fields'] # may need further resolving</code><code><br></code><code> for f in fields:</code><code> field = resolve1(f)</code><code> name, values = field.get('T'), field.get('V')</code><code><br></code><code> # decode name</code><code> name = decode_text(name)</code><code><br></code><code> # resolve indirect obj</code><code> values = resolve1(values)</code><code><br></code><code> # decode value(s)</code><code> if isinstance(values, list):</code><code> values = [decode_value(v) for v in values]</code><code> else:</code><code> values = decode_value(values)</code><code><br></code><code> data.update({name: values})</code><code><br></code><code> print(name, values)</code>

以上案例展示了Pdfminer.six在不同场景下的灵活应用,更多详细信息请参考:https://pdfminersix.readthedocs.io/en/latest/index.html

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容