Python PDF 处理:reportlab、PyMuPDF、pdfplumber 完整实战
Introduction
PDF 处理是办公自动化的核心场景。本文对比 reportlab(生成 PDF)、PyMuPDF(读取和操作 PDF)、pdfplumber(提取文本和表格)三个库的用法,附实战代码示例。
---
reportlab(生成 PDF)
pip install reportlab
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
from reportlab.lib import colors
from reportlab.lib.units import cm
doc = SimpleDocTemplate("report.pdf", pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2*cm, bottomMargin=2*cm)
styles = getSampleStyleSheet()
story = []
story.append(Paragraph("Python PDF 生成报告", styles['Title']))
story.append(Spacer(1, 0.5*cm))
story.append(Paragraph("这是一个使用 reportlab 生成的 PDF 示例。", styles['Normal']))
story.append(Spacer(1, 0.5*cm))
# 表格
table_data = [['产品', '销量', '收入'],
['Python书籍', 150, '7500元'],
['在线课程', 89, '17800元'],
['VIP会员', 45, '22500元']]
table = Table(table_data, colWidths=[5*cm, 3*cm, 3*cm])
table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor('#4472C4')),
('TEXTCOLOR', (0,0), (-1,0), colors.white),
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
('ALIGN', (0,0), (-1,-1), 'CENTER'),
('GRID', (0,0), (-1,-1), 1, colors.black),
]))
story.append(table)
doc.build(story)
print("PDF 已生成: report.pdf")
PyMuPDF(读取和操作 PDF)
pip install PyMuPDF
import fitz # PyMuPDF
doc = fitz.open("report.pdf")
print(f"页数: {len(doc)}")
for page_num in range(len(doc)):
page = doc[page_num]
text = page.get_text()
print(f"--- 第{page_num+1}页 ---")
print(text[:500]) # 只打印前500字符
# 提取图片
for img_index, img in enumerate(page.get_images()):
xref = img[0]
pix = fitz.Pixmap(doc, xref)
if pix.n - pix.alpha < 4:
pix.save(f"page{page_num+1}_img{img_index}.png")
else:
pix1 = fitz.Pixmap(fitz.csRGB, pix)
pix1.save(f"page{page_num+1}_img{img_index}.png")
# 按页拆分
doc.close()
pdfplumber(提取文本和表格)
pip install pdfplumber
import pdfplumber
with pdfplumber.open("report.pdf") as pdf:
for page in pdf.pages:
print(f"--- 第{page.page_number}页 ---")
text = page.extract_text()
print(text[:500] if text else "(无文字)")
# 提取表格
tables = page.extract_tables()
for table in tables:
print("表格:")
for row in table:
print(" | ".join(str(c or "") for c in row))
常见问题
Q1: PDF 中文乱码?reportlab 内置不支持中文,需要注册中文字体:FontDefinitions 以及 TTFont('Chinese', 'SimHei.ttf')。
Q2: 读取加密 PDF?PyMuPDF:doc = fitz.open("file.pdf", password="password")。
Q3: 合并多个 PDF?PyMuPDF:doc1 = fitz.open("a.pdf"); doc2 = fitz.open("b.pdf"); doc1.insert_pdf(doc2); doc1.save("merged.pdf")。
延伸阅读
- reportlab 图表和绘图
- PyMuPDF 文本查找和高亮
- PDF 表单处理
---
作者:小马 | 绍大技术网 shaoda.net