当 Agent 学会了写代码,但谁在替它写报告
Agent 把数据算完了、代码写完了、图做完了——然后你发现,没人替你把结果发给你老板。
事情是从"人够了,但报告不够快"开始的
这一两年我一直在用 Agent 干活。写代码、做设计、修 bug,Agent 干得比我快多了。
OpenHands 帮我改过 PR,Codex 帮我写过脚本,MCP 生态里那些工具我翻了个遍。Agent 替我做的事越来越多,我自己的时间也越来越空。
但有个环节一直卡着——出报告。
Agent 算完销售数据,结论写了几段话,停在终端里。我得手工把那些数字贴进 Word,排好版,调字体,存成 PDF,再发给客户。一份报告加班做,效率低还容易出错。
后来上了 Python + ReportLab 直接生成 PDF。能自动化了,但 ReportLab 的学习门槛摆在那。每种报告都要单独写一套代码去调排版、处理数据、画表格画图表。团队里不是所有人都能上手,新人来了要花一周才能写出第一份能看的报告。
当时我就在想:能不能封装一层,把 ReportLab 的复杂度藏起来,让写报告变成写个配置文件?
PDF Report Generator 就是这么来的。
项目地址:https://github.com/xingxingzaixian/pdf-report-generator
文档地址:https://xingxingzaixian.github.io/pdf-report-site/
MIT 协议,随便用。

设计思路
核心想法很简单:你给我 JSON,我给你 PDF。
不需要学 ReportLab 怎么创建文档对象、怎么设置字体、怎么画表格边框。JSON 里写清楚要什么,剩下的框架搞定。
from pdf_generator import PDFReportGenerator
config = {
"metadata": {"title": "销售月报"},
"elements": [
{"type": "text", "content": "月销售数据概览", "style": "title"},
{"type": "table", "dataSource": "sales", "columns": ["产品", "销量", "金额"]},
{"type": "chart", "chartType": "bar", "dataSource": "sales", "xAxis": "产品", "yAxis": "销量"}
]
}
generator = PDFReportGenerator(config_dict=config)
generator.add_data_source("sales", data_frame)
generator.save("sales_report.pdf")
这条代码放在 Agent 的 tool 列表里,它就是 Agent 的"报告技能"——Agent 跑完一套数据分析流程之后,调一行代码,PDF 就出来了。我们团队里的开发同学上手之后,从装包到生成第一份报告,快的 3 分钟。
数据源接得比较多
日常工作里数据来源五花八门,每个客户的系统也不一样。所以适配做了不少:
- CSV、Excel、JSON 文件直接读
- SQLite、PostgreSQL、MySQL 数据库直连
- HTTP API 拉取
- 代码里传 Pandas DataFrame

不管你数据在哪,进到系统里统一样处理,PDF 层不需要关心数据来源。
generator.add_data_source("sales", pd.DataFrame({
"产品": ["产品A", "产品B", "产品C"],
"销量": [150, 230, 180],
"金额": [45000, 69000, 54000]
}))
元素系统
没做大而全的编辑器,只做了几个高频需要的元素:
- 文本。支持 Jinja2 模板变量,文本里可以动态引用数据
- 表格。自定义表头颜色、列宽,支持单元格合并
- 图表。基于 Matplotlib 生成,柱状图、折线图、饼图、散点图、面积图五种
- 图片。Logo、现场照片、截图
- 列表、分页符、空白间距——控制排版用的基础件
每个元素只做一件事。Agent 拆任务的时候,按 JSON 里的元素列表逐个处理就行——不用 Agent 自己操心排版细节。
自己用起来,才知道哪些功能不能省
项目最初只有基础功能:文字、表格、图片。后来自己用起来了,发现有些东西不能没有。

自动目录。 报告长到十几页的时候,没有目录翻起来太痛苦。于是加了自动收集标题、生成可点击目录的功能。
页眉页脚。 客户要求每页右下角有页码、左上角有公司名称。左中右三栏布局都安排上了。
封面页。 有些报告需要正式封面,不想每次单独再做一份。
页码格式。 阿拉伯数字、罗马数字、中文数字都支持——有的客户要求正文用阿拉伯数字,前言用罗马数字。
中文支持。 国内团队嘛,这是必须解决的问题。项目自动加载系统内中文字体,装上就能用。
Agent 的工作流,缺的就是这最后一步
现在 2026 年,Agent 的工具链已经非常丰富了:
- OpenHands / Codex —— 编程 Agent
- ComfyUI —— 图像生成工作流
- Crawl4AI —— LLM 数据管道
- MCP 生态(Smithery 上 3000+ server)—— Agent 的外部工具接口
Agent 能读数据、能分析、能画图、能写代码——但没法把结果变成一份可交付的 PDF。
报告生成是 Agent 工作流里最后一个没人填的坑。PDF Report Generator 想填的就是这个。
它对 Agent 工作流的衔接方式很直接:
Python 库直接调用
我们自己的后端服务就是这么接的。Flask 里处理请求,JSON 配置传进来,PDF 流直接返回给前端。
Web API 服务
有些团队后端不是 Python,或者想独立部署报告生成服务。基于 FastAPI 做了完整 API:
pip install pdf-report-generator[api]
pdf-report-api --host localhost --port 8080
curl -X POST http://localhost:8080/api/generate \
-H "Content-Type: application/json" \
-d '{"config": {"metadata": {"title": "报告"}, "elements": [{"type": "text", "content": "Hello"}]}}' \
--output output.pdf
启动后自带 Swagger UI 和 ReDoc 文档,前后端联调挺省事的。
我自己的用法是:写好自己的 JSON 模板,定时任务跑,到点自动出报告——从数据采集到客户收到报告,全程无人值守。
说几句实话
这个项目是从团队真实需求里长出来的,不是为造轮子而造轮子。核心就一个想法:降低从数据到 PDF 的门槛。
现在还在持续迭代。图表样式目前依赖 Matplotlib 默认主题,后续打算让用户可以自定义图表配色和字体。如果你有兴趣,欢迎来提 Issue 和 PR。
如果你也在被报告生成这件事困扰,装一个跑跑 demo 试试——
pip install pdf-report-generator
# 要 API 功能
pip install pdf-report-generator[api]
一个人、一个 Agent、一条报告流水线。以前是我自己写代码、自己做图、自己出报告。后来变成 Agent 写代码、Agent 做图、我出报告。现在是 Agent 写代码、Agent 做图、Agent 也出报告。
PDF Report Generator 就是最后那步。
项目地址:https://github.com/xingxingzaixian/pdf-report-generator
能给个 Star 就更好了——每个 Star 对小团队都是实实在在的鼓励 ⭐
MIT 协议开源,放心使用。

浙公网安备 33010602011771号