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 交互式表单提取。
- 目录提取。
- 标记内容提取。
- 自动布局分析。
环境要求: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)
使用案例
- 解析 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
© 版权声明
博主的文章没有高度、深度和广度,只是凑字数。利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的纯镀 24k 文章!如若有侵权,请联系博主删除。
喜欢就点个赞吧