reportlab中文显示方块的根本原因是默认不支持中文字体,须手动注册truetype字体(如notosanscjksc-regular.ttf)并显式指定fontname;表格列宽需手动设置colwidths,不可依赖自动计算;插入图表要高dpi导出并避免强制缩放;页眉页脚需用pagetemplate与frame自定义实现。

ReportLab生成PDF时中文显示为方块或乱码
根本原因是ReportLab默认不支持中文字体,直接写入中文会 fallback 到缺失字体,结果就是方块或空格。不是编码问题,也不是文件保存方式的问题,是字体注册没做对。
- 必须手动注册一个支持中文的TrueType字体(如
NotoSansCJKsc-Regular.ttf或系统里的simhei.ttf),不能只靠getSampleStyleSheet() - 注册后要显式在
ParagraphStyle或SimpleDocTemplate中指定fontName,否则仍走默认的Helvetica - 推荐用
pdfmetrics.registerFont()+pdfmetrics.registerFontFamily()配合注册常规/粗体,否则bold=True会失效
示例关键片段:
from reportlab.pdfbase import pdfmetrics<br>from reportlab.pdfbase.ttfonts import TTFont<br><br>pdfmetrics.registerFont(TTFont('Noto', 'NotoSansCJKsc-Regular.ttf'))<br>pdfmetrics.registerFontFamily('Noto', normal='Noto', bold='Noto')<br><br>style = ParagraphStyle('normal', fontName='Noto', fontSize=12)
用Table写数据表格时列宽错乱、内容被截断
ReportLab的 Table 不自动适配内容宽度,colWidths 必须显式设置,否则默认等分且极窄,长文本直接换行或溢出。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 避免用
None或空列表让 ReportLab “自动计算”——它不会真算,只会按最小单位分配 - 数值型列宽单位是“点(pt)”,1英寸 ≈ 72pt;常用 A4 宽度约 550pt,减去左右边距后,按比例分配更稳
- 如果数据长度差异大,优先用
Spacer+ 多个窄Table拆分,比硬塞进一个自适应表更可控 - 别依赖
Table.setStyle([('WORDWRAP', ...)])来救布局——它只控制换行,不调整列宽
向PDF插入图表(Matplotlib/Pillow图)后模糊或拉伸变形
本质是图像分辨率与PDF渲染逻辑不匹配。ReportLab把图片当矢量对象处理,但实际插入的是位图,缩放时无损能力有限。
- 生成图表时务必设高DPI:Matplotlib用
plt.savefig(..., dpi=300),Pillow用image.resize(..., resample=Image.LANCZOS) - 插入PDF时用
Image类,传入原始尺寸(单位pt),不要靠width/height强制缩放——这会导致插值失真 - 如果图含透明通道(如PNG),ReportLab可能丢弃alpha,导出前先转RGB:
img = img.convert('RGB') - 大图建议预压缩到 1500px 宽以内,再传给
Image,否则PDF体积暴涨且渲染卡顿
生成带页眉页脚和动态页码的PDF报告
ReportLab没有内置页眉页脚模板,得靠 PageTemplate + Frame + 自定义 PageDraw 实现,核心是重载 afterDrawPage 方法。
- 页码必须用
PageNumber类,不能用字符串拼接,否则所有页都显示“1” - 页眉页脚内容要放在
Frame之外,否则会被正文流覆盖;典型做法是定义两个Frame(主内容区 + 页脚区),再用PageTemplate组合 - 动态内容(如当前章节名)需在构建文档前缓存好,ReportLab不支持运行时查上下文
- 注意A4纸的坐标原点在左下角,页脚Y坐标通常设为
inch,页眉用height - inch
事情说清了就结束:ReportLab不是“填数据出PDF”的黑盒,它的每个视觉效果背后都有明确的坐标、字体、尺寸契约。漏掉任意一环,结果都是静默失败——比如中文没注册字体,它不会报错,只会打方块。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










