Python PDF 处理:reportlab、PyMuPDF、pdfplumber 完整实战

小飞兽 Python 9 次阅读 2026-07-24

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