ReportLab 是一个非常强大的 Python 库,专门用于生成 PDF 文档,它功能全面,可以创建从简单报告到复杂表格、图表和矢量图形的各种 PDF 文件。

第一步:安装 ReportLab
安装 ReportLab 非常简单,通常使用 Python 的包管理工具 pip 即可。
打开终端或命令提示符
- Windows: 打开 "命令提示符" (CMD) 或 "PowerShell"。
- macOS / Linux: 打开 "终端" (Terminal)。
使用 pip 安装
在终端中输入以下命令并按回车:
pip install reportlab
如果遇到权限问题 (macOS / Linux):
在某些系统上,你可能需要使用 sudo 来获取安装权限:

sudo pip install reportlab
如果遇到权限问题 (Windows):
如果提示权限不足,请以管理员身份运行 CMD 或 PowerShell,具体操作是:在开始菜单中搜索 "cmd" 或 "powershell",右键点击它,然后选择“以管理员身份运行”。
升级 ReportLab:
如果你已经安装过 ReportLab,并希望升级到最新版本,可以使用以下命令:

pip install --upgrade reportlab
验证安装
安装完成后,你可以通过在 Python 环境中导入 reportlab 来验证安装是否成功。
在终端中运行 python 或 python3 进入交互式环境:
>>> import reportlab >>> print(reportlab.Version) '3.6.12' # 你看到的版本号可能不同
如果没有报错,并输出了一个版本号,说明 ReportLab 已经成功安装。
第二步:一个简单的 "Hello World" 示例
让我们创建一个最简单的 PDF 文件来测试 ReportLab 的基本功能。
创建一个名为 hello_reportlab.py 的文件,并粘贴以下代码:
# 1. 导入所需的模块
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter, A4
from reportlab.lib.units import inch
# 2. 创建一个 canvas 对象
# 'hello.pdf' 是要生成的文件名
# pagesizes=A4 指定了页面大小,也可以是 letter
c = canvas.Canvas("hello.pdf", pagesize=A4)
# 3. 在画布上绘制文本
# c.drawString(x坐标, y坐标, "要显示的文本")
# 坐标原点(0,0)在左下角
c.drawString(100, 750, "Hello, ReportLab!")
# 你也可以设置字体大小
c.setFont("Helvetica", 24)
c.drawString(100, 700, "This is a bigger font.")
# 4. 保存 PDF 文件
# 这一步非常重要,没有它,文件不会生成
c.save()
print("PDF 文件 'hello.pdf' 已生成成功!")
如何运行:
在终端中,导航到你保存文件的目录,然后运行:
python hello_reportlab.py
运行后,你会发现当前目录下多了一个名为 hello.pdf 的文件,用 PDF 阅读器打开它,你应该能看到 "Hello, ReportLab!" 和 "This is a bigger font."。
第三步:ReportLab 的核心概念与常用功能
为了更好地使用 ReportLab,了解其核心概念很重要。
核心概念
canvas.Canvas: 这是 ReportLab 的核心对象,你可以把它想象成一张白纸,你所有的操作(画线、写文字、画形状)都是在这张纸上进行的。- 坐标系统: 坐标原点
(0, 0)位于页面的左下角,X 轴向右增加,Y 轴向上增加,这与屏幕坐标(原点在左上角)不同。 c.save(): 在完成所有绘制操作后,必须调用save()方法,否则 PDF 文件不会被正确写入磁盘。
常用功能示例
下面是一个更全面的示例,展示了如何创建一个包含标题、段落、列表和表格的 PDF。
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
from reportlab.lib import colors
# --- 方法一:使用 canvas (底层 API) ---
def create_pdf_with_canvas(filename):
c = canvas.Canvas(filename, pagesize=A4)
width, height = A4
# 标题
c.setFont("Helvetica-Bold", 24)
c.drawString(100, height - 100, "Canvas 方法示例")
# 普通文本
c.setFont("Helvetica", 12)
text = "这是使用 canvas 对象直接绘制的段落,这种方法适合绘制简单的图形和文本。"
c.drawString(100, height - 150, text)
# 画一条线
c.line(100, height - 200, width - 100, height - 200)
c.save()
# --- 方法二:使用 Platypus (高级 API) ---
# Platypus 是 ReportLab 的高级布局工具,更适合创建复杂文档
def create_pdf_with_platypus(filename):
# 创建一个文档模板
doc = SimpleDocTemplate(filename, pagesize=A4)
# 获取一组预设样式
styles = getSampleStyleSheet()
# 创建一个元素列表,Platypus 会按顺序排列它们
story = []
# 添加标题= Paragraph("<b>Platypus 方法示例</b>", styles['h1'])
story.append(title)
story.append(Spacer(1, 0.5*cm)) # 添加一些空间
# 添加段落
p_text = ("这是使用 Platypus 框架创建的段落。"
"Platypus 使用 <i>flowables</i>(可流动元素)的概念,"
"可以更轻松地构建复杂的文档布局,如列表、表格等。")
p = Paragraph(p_text, styles['BodyText'])
story.append(p)
story.append(Spacer(1, 0.5*cm))
# 添加一个表格
data = [
['项目', '数量', '单价'],
['苹果', '5', '¥5.00'],
['香蕉', '8', '¥3.50'],
['橙子', '10', '¥4.20']
]
table = Table(data)
# 设置表格样式
table.setStyle(TableStyle([
('BACKGROUND', (0, 0), (-1, 0), colors.grey), # 表头背景
('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke), # 表头文字颜色
('ALIGN', (0, 0), (-1, -1), 'CENTER'), # 居中对齐
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'), # 表头字体
('FONTSIZE', (0, 0), (-1, 0), 14), # 表头字号
('BOTTOMPADDING', (0, 0), (-1, 0), 12), # 表头底部间距
('BACKGROUND', (0, 1), (-1, -1), colors.beige), # 数据行背景
('GRID', (0, 0), (-1, -1), 1, colors.black) # 画网格线
]))
story.append(table)
# 构建并生成 PDF
doc.build(story)
# --- 主程序 ---
if __name__ == "__main__":
# 使用 canvas 方法生成 PDF
create_pdf_with_canvas("canvas_example.pdf")
print("canvas_example.pdf 已生成")
# 使用 platypus 方法生成 PDF
create_pdf_with_platypus("platypus_example.pdf")
print("platypus_example.pdf 已生成")
运行这个脚本,你会得到两个功能更丰富的 PDF 文件。
常见问题与解决方案
Q1: 安装时提示 "Could not find a version that satisfies the requirement reportlab"
可能原因:
- 网络连接问题。
pip本身需要更新。- Python 环境配置有问题。
解决方案:
- 检查网络: 确保你的计算机可以访问 PyPI (Python Package Index)。
- 更新 pip: 在终端运行
python -m pip install --upgrade pip。 - 使用国内镜像 (如果网络访问 PyPI 较慢):
pip install reportlab -i https://pypi.tuna.tsinghua.edu.cn/simple
或者使用阿里云镜像:
pip install reportlab -i https://mirrors.aliyun.com/pypi/simple/
Q2: 运行代码时提示 ModuleNotFoundError: No module named 'reportlab'
可能原因: 你安装 ReportLab 的 Python 环境,与运行代码的 Python 环境不是同一个,这通常发生在你系统中有多个 Python 版本时(Python 2 和 Python 3,或者系统自带的 Python 和你通过官网安装的 Python)。
解决方案:
- 检查 Python 路径: 在终端运行
which python(macOS/Linux) 或where python(Windows),看看它指向的是哪个 Python 可执行文件。 - 使用明确的 pip: 尝试使用
python3 -m pip install reportlab或python -m pip install reportlab来确保你正在为正确的 Python 环境安装。 - 在虚拟环境中安装: 强烈建议使用虚拟环境(如
venv或conda)来管理项目依赖,这样可以避免环境冲突。
Q3: 如何在 PDF 中显示中文?
问题: ReportLab 默认不支持中文字体,如果你直接在 canvas.drawString() 或 Paragraph 中写入中文字符,可能会显示为方框或乱码。
解决方案: 你需要指定一个系统中已安装的中文字体。
-
找到中文字体路径:
- Windows: 通常在
C:\Windows\Fonts\目录下,simhei.ttf(黑体) 或simsun.ttc(宋体)。 - macOS: 通常在
/System/Library/Fonts/或/Library/Fonts/目录下。 - Linux: 通常在
/usr/share/fonts/目录下。
- Windows: 通常在
-
在代码中注册并使用字体:
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
# 注册 TrueType 字体
# 将 'SimHei.ttf' 替换为你系统中中文字体的实际路径
# 如果字体和脚本在同一目录,可以直接写 'SimHei.ttf'
try:
pdfmetrics.registerFont(TTFont('SimHei', 'C:/Windows/Fonts/simhei.ttf'))
print("字体注册成功!")
except Exception as e:
print(f"字体注册失败: {e}")
print("请确保字体路径正确,并且你有权限访问该文件。")
# 创建 canvas
c = canvas.Canvas("chinese_example.pdf")
c.setFont("SimHei", 16) # 使用注册的字体
c.drawString(100, 750, "你好,世界!")
c.drawString(100, 700, "This is English.")
c.save()
希望这份详细的指南能帮助你顺利安装和使用 ReportLab!
