PDFMiner.six 库介绍
官网文档
PDFMiner.six 是一个用于从 PDF 文档中提取信息的 Python 库。它专注于获取和分析 PDF 中的文本内容,而不是对 PDF 进行渲染或转换。该库是 PDFMiner 的 Python 3 兼容版本,能够处理 PDF 中的文本、布局、字体和图像等元素。
主要功能
- 提取 PDF 文档中的文本内容
- 保留文本的原始布局和格式信息
- 识别不同的字体、大小和样式
- 提取表格数据和图像
- 处理包含中文等非拉丁字符的 PDF
安装 python-docx 库:当前版本20250506
pip install pdfminer.six
一, 类结构图
PDFMiner.six 的核心类结构如下:
- PDFParser:解析 PDF 文件的底层结构
- PDFDocument:表示整个 PDF 文档
- PDFPage:表示文档中的单个页面
- PDFResourceManager:管理解析过程中使用的资源
- PDFInterpreter:解释器,处理页面内容
- PDFDevice:设备抽象,用于将解释结果输出到不同格式
- TextConverter:将 PDF 转换为文本
- HTMLConverter:将 PDF 转换为 HTML
- XMLConverter:将 PDF 转换为 XML
- LTContainer:布局对象的基类
- LTPage:页面布局
- LTTextBox:文本框
- LTTextLine:文本行
- LTChar:单个字符
- LTFigure:图形对象
- LTImage:图像对象
- LTLine:线条
- LTRect:矩形
二, 常用类和方法详解
- 解析 PDF 文件:PDFParser 和 PDFDocument
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
# 打开 PDF 文件
with open('example.pdf', 'rb') as fp:
# 创建解析器
parser = PDFParser(fp)
# 创建文档对象
document = PDFDocument(parser)
# 检查文档是否可以解析
if not document.is_extractable:
raise PDFTextExtractionNotAllowed
- 创建资源管理器和设备:PDFResourceManager 和 PDFDevice
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
# 创建资源管理器
rsrcmgr = PDFResourceManager()
# 创建参数分析器
laparams = LAParams()
# 创建文本转换器
output = StringIO() # 或使用文件对象
device = TextConverter(rsrcmgr, output, laparams=laparams)
- 解释和处理 PDF 内容: PDFInterpreter
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
# 创建解释器
interpreter = PDFPageInterpreter(rsrcmgr, device)
# 处理每一页
for page in PDFPage.create_pages(document):
interpreter.process_page(page)
# 获取结果
text = output.getvalue()
- 提取文本的完整流程
pdf_text_extraction.py
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from io import StringIO
def extract_text_from_pdf(pdf_path):
"""从 PDF 文件中提取文本"""
output = StringIO()
rsrcmgr = PDFResourceManager()
device = TextConverter(rsrcmgr, output, laparams=LAParams())
with open(pdf_path, 'rb') as fp:
interpreter = PDFPageInterpreter(rsrcmgr, device)
for page in PDFPage.create_pages(fp):
interpreter.process_page(page)
text = output.getvalue()
device.close()
output.close()
return text
# 使用示例
if __name__ == "__main__":
text = extract_text_from_pdf('example.pdf')
print(text)
- 提取布局信息
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams, LTTextBox, LTTextLine
# 创建资源管理器和布局分析器
rsrcmgr = PDFResourceManager()
laparams = LAParams()
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)
# 处理页面
for page in PDFPage.create_pages(document):
interpreter.process_page(page)
layout = device.get_result()
# 遍历布局对象
for element in layout:
if isinstance(element, LTTextBox) or isinstance(element, LTTextLine):
print(element.get_text())
- 提取表格信息
from pdfminer.layout import LTTextBoxHorizontal
def extract_tables(layout):
"""尝试从布局中提取表格数据"""
tables = []
current_table = []
current_row = []
# 按Y坐标排序文本框
text_boxes = [obj for obj in layout if isinstance(obj, LTTextBoxHorizontal)]
text_boxes.sort(key=lambda obj: -obj.y0) # 从上到下排序
# 简单的表格检测逻辑
current_y = None
for box in text_boxes:
if current_y is None:
current_y = box.y0
current_row.append(box.get_text().strip())
elif abs(box.y0 - current_y) < 5: # 同一行
current_row.append(box.get_text().strip())
else: # 新行
current_table.append(current_row)
current_row = [box.get_text().strip()]
current_y = box.y0
if current_row:
current_table.append(current_row)
if current_table:
tables.append(current_table)
return tables
三,注意事项
- PDFMiner.six 主要用于文本提取,而非 PDF 生成
- 复杂布局的 PDF 可能需要自定义布局分析逻辑
- 对于简单的文本提取,可以使用更高级的包装库如 PyPDF2 或 pdfplumber
- 处理包含大量图像或复杂格式的 PDF 时可能性能较低
- 中文等非拉丁字符需要确保正确设置编码和字体
PDFMiner.six 是一个功能强大的 PDF 文本提取工具,适合需要精确控制文本提取过程的场景,尤其是需要保留原始布局信息的情况。对于简单的文本提取需求,可以考虑使用更简洁的库如 pdfplumber 或 PyPDF2