0

0

Python生成PDF报表怎么做_ReportLab库通过后端数据画PDF

P粉602998670

P粉602998670

发布时间:2026-03-18 02:49:15

|

382人浏览过

|

来源于php中文网

原创

ReportLab显示中文需注册中文字体并设字体族,生成表格应使用Table类预处理数据为字符串,PDF损坏多因未调用canvas.save()或含非法字符,Jinja2仅用于内容渲染不可介入布局层。

python生成pdf报表怎么做_reportlab库通过后端数据画pdf

ReportLab画PDF时中文显示成方块或乱码怎么办

根本原因是ReportLab默认不支持中文字体,直接用drawStringParagraph写中文,会触发UnicodeEncodeError或渲染成空白方块。

必须显式注册中文字体(如NotoSansCJK、simhei.ttf等),且字体文件路径要真实存在。Windows下常见误用simhei.ttf但实际系统里是simhei.ttfmsyh.ttc,Linux/macOS则通常没有预装中文字体。

  • pdfmetrics.registerFont注册字体前,先用os.path.exists确认字体文件路径可读
  • 注册后必须调用pdfmetrics.registerFontFamily把字体设为“标准字体族”,否则Paragraph仍可能 fallback 到默认无中文的字体
  • 推荐用NotoSansCJK-SimplifiedChinese(Google开源,免版权),下载后解压取NotoSansCJKsc-Regular.otf即可

用ReportLab动态填充数据生成表格报表的正确姿势

别用drawString一行行算坐标拼表格——容易错位、无法自动换页、列宽难控制。ReportLab原生的Table类才是正解,但要注意它对数据类型敏感:所有单元格内容必须是字符串或Flowable对象(如Paragraph),不能直接塞intdatetime

  • 数据预处理阶段统一转str(),日期用.strftime('%Y-%m-%d')格式化,数值建议用f"{x:.2f}"避免科学计数法
  • Tablestyle参数必须传TableStyle实例,不能传列表字面量;常用样式如('GRID', (0,0), (-1,-1), 0.5, colors.grey)控制边框
  • 列宽用colWidths指定,单位是磅(point),不是像素;建议用[1*inch, 2*inch, ...]比硬写数字更可靠

ReportLab生成PDF后文件打不开或提示“损坏”

最常见原因是没调用canvas.save(),或者canvas对象被提前del或作用域结束导致缓冲区未刷出。另一个隐蔽问题是PDF内容含非法字符,比如数据库字段里混入了\x00\uFFFD这类控制符,ReportLab不会报错但输出文件不可读。

天工AI
天工AI

昆仑万维推出的国内首款融入大语言模型的AI对话问答、AI搜索引擎,知识从这里开始。

下载

立即学习Python免费学习笔记(深入)”;

  • 确保canvas.save()with open(...)上下文管理器的finally块或之后执行,不要依赖GC
  • 对所有外部输入(尤其是数据库字段、用户提交文本)做清洗:text.replace('\x00', '').replace('\ufffd', '')
  • 生成后用pdfplumber.open()或命令行pdfinfo快速验证文件结构是否合法

ReportLab和Jinja2模板混合使用的边界在哪

ReportLab本身不是模板引擎,硬套Jinja2生成Paragraph内容可以,但千万别用Jinja2去拼整个PageTemplateFrame结构——逻辑会失控,调试极难。适合的分工是:Jinja2负责“内容层”(比如把JSON数据转成[[row1], [row2]]这种表格数据),ReportLab负责“布局层”(定义页眉、分栏、字体、表格样式)。

  • Jinja2渲染结果必须是纯Python结构(list/dict/str),不能返回Markup或HTML字符串——ReportLab不吃那一套
  • 如果报表需要条件样式(比如金额"is_negative": True字段),样式逻辑留在ReportLab的TableStyle里用if判断
  • 避免在Jinja2模板里调用reportlab.platypus.Paragraph——这会让模板强依赖ReportLab,违背关注点分离

ReportLab的坑不在语法,而在字体加载时机、PDF流写入顺序、以及数据到布局的映射精度。一个registerFont漏掉,整份报表就变方块;一个save()忘写,生成的PDF就是0字节。这些地方没法靠“多试几次”绕过去,得盯住每一步的返回值和文件状态。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

458

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

84

2025.09.10

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

338

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

225

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

17

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号