当 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 协议,随便用。

00-cover

设计思路

核心想法很简单:你给我 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
    01-data-sources

不管你数据在哪,进到系统里统一样处理,PDF 层不需要关心数据来源。

generator.add_data_source("sales", pd.DataFrame({
    "产品": ["产品A", "产品B", "产品C"],
    "销量": [150, 230, 180],
    "金额": [45000, 69000, 54000]
}))

元素系统

没做大而全的编辑器,只做了几个高频需要的元素:

  • 文本。支持 Jinja2 模板变量,文本里可以动态引用数据
  • 表格。自定义表头颜色、列宽,支持单元格合并
  • 图表。基于 Matplotlib 生成,柱状图、折线图、饼图、散点图、面积图五种
  • 图片。Logo、现场照片、截图
  • 列表分页符空白间距——控制排版用的基础件

每个元素只做一件事。Agent 拆任务的时候,按 JSON 里的元素列表逐个处理就行——不用 Agent 自己操心排版细节。

自己用起来,才知道哪些功能不能省

项目最初只有基础功能:文字、表格、图片。后来自己用起来了,发现有些东西不能没有。

02-advanced-features

自动目录。 报告长到十几页的时候,没有目录翻起来太痛苦。于是加了自动收集标题、生成可点击目录的功能。

页眉页脚。 客户要求每页右下角有页码、左上角有公司名称。左中右三栏布局都安排上了。

封面页。 有些报告需要正式封面,不想每次单独再做一份。

页码格式。 阿拉伯数字、罗马数字、中文数字都支持——有的客户要求正文用阿拉伯数字,前言用罗马数字。

中文支持。 国内团队嘛,这是必须解决的问题。项目自动加载系统内中文字体,装上就能用。

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 协议开源,放心使用。

posted @ 2026-07-31 09:31  星星在线  阅读(1)  评论(0)    收藏  举报