支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-07-12 22:15:48 Python ReportLab PDF生成
最近有个需求要自动生成PDF报告,查了一圈Python的库,ReportLab算是老牌的了,功能全,就是感觉文档有点散。
这里把一次完整的使用过程记下来,包括文本、表格和图片怎么塞进去,还有一些我当时踩过的小坑。
环境准备其实很简单,装两个包就行:
reportlab==4.0.4
Pillow==10.0.0
然后pip install -r requirements.txt一把搞定。Pillow主要是处理图片用,ReportLab依赖它。
直接把代码贴出来,再分块说。下面这个脚本会生成一个叫sample_report.pdf的文件:
from reportlab.lib.pagesizes import letter
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Image
from reportlab.lib.units import inch
def create_pdf(filename):
# 创建PDF文档
doc = SimpleDocTemplate(filename, pagesize=letter)
# 内容元素列表
elements = []
# 添加标题
styles = getSampleStyleSheet()
title_style = ParagraphStyle(
name="TitleStyle",
parent=styles["Heading1"],
fontSize=24,
leading=30,
spaceAfter=20,
alignment=1 # 居中
)
elements.append(Paragraph("测试报告", title_style))
# 添加文本段落
normal_style = styles["Normal"]
elements.append(Paragraph("这是一个使用Python reportlab库生成的PDF文档示例。", normal_style))
elements.append(Spacer(1, 0.2*inch))
# 添加表格
data = [
["项目", "描述", "价格"],
["产品A", "高质量产品", "$19.99"],
["产品B", "经济型产品", "$9.99"],
["产品C", "豪华套装", "$49.99"]
]
table = Table(data, colWidths=[1.5*inch, 3*inch, 1*inch])
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), 12),
('BOTTOMPADDING', (0, 0), (-1, 0), 12),
('BACKGROUND', (0, 1), (-1, -1), colors.beige),
('GRID', (0, 0), (-1, -1), 1, colors.black),
]))
elements.append(table)
elements.append(Spacer(1, 0.5*inch))
# 添加图片
try:
img = Image("https://picsum.photos/400/200", width=4*inch, height=2*inch)
elements.append(img)
except:
elements.append(Paragraph("(图片加载失败)", normal_style))
# 生成PDF
doc.build(elements)
if __name__ == "__main__":
create_pdf("sample_report.pdf")
print("PDF文件已生成: sample_report.pdf")
整个文档的骨架是靠SimpleDocTemplate,指定好页面尺寸(这里用的是letter),然后往一个叫elements的列表里塞各种对象,最后doc.build(elements)一下就生成文件了。这种“流水线”模式用起来还比较直观,加内容就append,调顺序直接动列表就行。
标题部分我用的是ParagraphStyle,继承自内置的Heading1,然后把字号调大,加了行距,并且居中。不用居中直接把alignment去掉或者设成0就行。
表格那块,先准备好数据二维列表,第一行当表头。Table创建时可以传colWidths指定每列宽度,不然自动算出来的有时会挤在一起。TableStyle是个很长的元组列表,每个元组第一个元素是指令,后面是作用的单元格范围,最后是参数。
这里我让表头灰底白字、加粗,数据行米色背景,所有单元格都加了网格线。注意范围里(0,0)到(-1,0)就是第一行所有列,(0,1)到(-1,-1)是从第二行到最后一行。背景色、文字颜色、对齐这些一个个调就行,倒不复杂,就是容易写窜行。
插入图片用Image,可以指定宽高,网络图片也能直接传URL。不过这里有个容易忽略的点:图片不一定能加载成功,如果网络不通或者地址失效,程序就直接崩了,所以最好用try包起来,失败时塞一个替代的段落文本,保证PDF还是能生成出来。
再说几个我当时遇到的小问题。
图片加载失败上面已经说了,加异常处理是最基本的。
另外如果你需要展示中文,可能会发现出来的是乱码或小方块。这个是因为ReportLab默认字体不支持中文,得让系统能找到中文字体。可以通过_FBFontName参数去指定,前提是你系统里确实装了对应字体。这块需要额外配置一下,不是装上库就能直接用中文。
表格对齐有时候明明设了'ALIGN', (0,0), (-1,-1), 'CENTER'但某一列还是看着偏,多半是列宽没设对,或者内容太长自动换行后效果怪。把colWidths仔细调一下,实在不行就给那一列单独套一个Paragraph来控制对齐。
Spacer是用来在元素之间加空白间隔的,类似于手动换行加空行。宽度传1,高度给个尺寸就行,单位英寸用inch常量比较方便。
整篇文档其实就是对这些元素的理解和排列,没有太高深的东西,但是细节多了就容易漏。比如样式名如果乱写,或者表格颜色用的字符串不对,构建的时候会报一些不怎么好读的错误。
好在大部分问题多打几个log或者拆开步骤调试都能定位。
这差不多就是我用ReportLab生成一份标准报告的过程了。把上面的代码直接拿走改改数据和文字,应该能满足不少场景的PDF输出需求。
本文详细解析Aspose.PDF中加载本地TTF和TTC字体的全套解决方案。针对TTF文件,可便捷使用FontRepository.openFont()直接加载。而面对TTC文件,我们提供了两种策略:借助FontForge等工具提取TTF子字体,或利用系统已安装的TTC字体名称进行高效加载,并附带字体名称验证与常见问题解答,确保您的PDF字体显示无忧。
深入探讨Python实现WebSocket连接MQTT服务器的配置细节与故障排查策略。从环境搭建到协议适配,再到DNS、库兼容和网络问题的解决方案,本文提供全面的技术指导,助您掌握核心连接技术,有效提升物联网应用稳定性与可靠性。
还在为Python无法直接处理Matlab数据而头疼?本文带你一步步掌握使用SciPy库高效读取.mat文件的方法,从安装到数据提取,详细教程让你轻松驾驭跨平台数据交换,提升你的科研与开发效率。
Linux系统下查看SSL证书有效期的三种方法:OpenSSL命令、Python脚本及浏览器查看。OpenSSL命令支持远程服务器和本地证书文件的查看,并可检查证书有效性;Python脚本提供编程方式获取证书信息;浏览器查看则适用于快速验证。文章还强调了证书格式处理和时间同步的重要性,并建议结合自动化监控定期检查证书有效期,确保网站安全性和可靠性。