本文目录导读:

- ReportLab(最强大、专业级)
- WeasyPrint(HTML 转 PDF 最佳)
- FPDF2(轻量、跨平台)
- Matplotlib + PdfPages(数据可视化)
- jinja2 + ReportLab(模版化方案)
- 其他值得关注的库
- 推荐选择指南
- 注意事项
Python 中可用于生成 PDF 的库非常丰富,主要可以分为基础绘制类、HTML/模板类、报告类和专业图形类,以下是最常用、最值得推荐的几个库,按推荐度和适用场景排序:
ReportLab(最强大、专业级)
用途:从零开始绘制 PDF,支持最复杂的排版和图形。
- 特点:
- 支持画布(canvas)和文档模板(platypus)
- 支持表格、图表、段落、页眉页脚、水印
- 可嵌入字体、图片、矢量图形
- 支持高度自定义,性能优异
- 适用场景:需要精确控制每个元素位置、生成复杂报表、发票、证书等
- 示例:
from reportlab.pdfgen import canvas c = canvas.Canvas("hello.pdf") c.drawString(100, 750, "Hello World") c.save()
WeasyPrint(HTML 转 PDF 最佳)
用途:将 HTML/CSS 渲染为 PDF,支持现代 CSS 特性。
- 特点:
- 完美支持 CSS3、Flexbox、Grid、@page 规则
- 自动处理分页、页码
- 支持从 URL 或文件读取 HTML
- 输出质量极高
- 适用场景:已有 HTML 模板、需要精确排版又想避免从零绘制
- 示例:
from weasyprint import HTML HTML(string='<h1>Hello</h1><p>World</p>').write_pdf('output.pdf')
FPDF2(轻量、跨平台)
用途:简单 PDF 生成,API 类似 PHP 的 FPDF。
- 特点:
- 无外部依赖,安装简单
- 支持 Unicode(通过 TTF 字体)
- 内置表格、单元格、多重文本等功能
- 代码风格直白易懂
- 适用场景:快速生成简单文档、报表、发票
- 示例:
from fpdf import FPDF pdf = FPDF() pdf.add_page() pdf.set_font("Arial", size=12) pdf.cell(200, 10, text="Hello World", align="C") pdf.output("simple.pdf")
Matplotlib + PdfPages(数据可视化)
用途:将图表和数据可视化结果导出为 PDF。
- 特点:
- 完美支持 Matplotlib 所有图表
- 支持多页 PDF、矢量图
- 可嵌入报告框架中
- 适用场景:数据分析报告、科学论文图表
- 示例:
import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages
with PdfPages('charts.pdf') as pdf: plt.plot([1,2,3], [4,5,6]) pdf.savefig() plt.close()
## 5. pdfkit(wkhtmltopdf 封装)
**用途**:HTML 转 PDF(基于 WebKit 引擎)。
- **特点**:
- 支持复杂的 HTML+CSS+JS 渲染
- 可设置页面大小、边距、页眉页脚
- 需安装 wkhtmltopdf 二进制文件
- **适用场景**:需要渲染包含 JavaScript 的网页
- **示例**:
```python
import pdfkit
pdfkit.from_string('<h1>Hello</h1>', 'out.pdf')
jinja2 + ReportLab(模版化方案)
用途:动态生成复杂报告的最佳组合。
- 思路:用 Jinja2 定义数据模板 → 填充数据 → ReportLab 渲染
- 优势:数据与样式分离,适合批量生成
其他值得关注的库
| 库名 | 特点 | 适用场景 |
|---|---|---|
| PyPDF2 / pypdf | 主要读取、合并、拆分 PDF | 操作已有PDF |
| pdfminer.six | PDF 内容提取(文本、表格) | 数据抽取 |
| cairo / pycairo | 底层矢量图形库 | 高性能图形 |
| rst2pdf | reStructuredText 转 PDF | 文档生成 |
| pdfplumber | 提取表格、文本 | PDF 数据解析 |
推荐选择指南
| 你的需求 | 推荐库 |
|---|---|
| 从零绘制复杂PDF(专业级) | ReportLab |
| 用HTML做精美排版 | WeasyPrint |
| 快速生成简单文档 | FPDF2 |
| 数据可视化报告 | Matplotlib |
| 操作已有PDF(合并/拆分) | pypdf |
| 批量生成模板化报告 | Jinja2 + ReportLab |
注意事项
- 中文支持:ReportLab 和 FPDF2 需要加载中文字体文件(如
simhei.ttf),WeasyPrint 通常自动处理 - 性能:复杂文档优先 ReportLab,大量小文档优先 FPDF2
- 安装依赖:WeasyPrint 在 macOS/Linux 可能需要系统字体库,Windows 一般直接可用
对于大多数 Web 开发场景,WeasyPrint 和 ReportLab 是最实用的两个选择:前者适合基于 HTML 模板快速出稿,后者适合需要高度定制的商业报告。