医数智联·第 20 期:Python + 质控报告 PDF 自动生成 —— 一键生成院长周报,告别 Word 排版
医数智联·第 20 期:Python + 质控报告 PDF 自动生成 —— 一键生成院长周报,告别 Word 排版
[!ABSTRACT] 核心摘要
- 本期主题:Python + reportlab 自动生成 PDF 质控报告
- 核心结论:报告 PDF 不再用 Word 排,1 行代码搞定,数据更新自动重出
- 3 大核心库:reportlab(PDF 生成)+ matplotlib(图表)+ pandas(数据)
- 3 大医院场景:基础报告、含图表报告、完整院长周报
- 典型效果:从「半天排版 Word」变成「5 秒生成 PDF」
- 阅读时长:约 10 分钟
一、场景引入:为什么医院需要「PDF 自动生成」?
[!example] 一个真实的周一早晨
质管办小李每周一上午要给院长交一份「上周质控周报」。他的工作流程:
- 跑 SQL 拿数据 → 半小时
- 复制到 Excel 排版 → 半小时
- 截图插入 Word → 半小时
- 调整字号、标题、页眉页脚 → 半小时
- 导出 PDF → 5 分钟
2 小时过去了,周报终于交出。
但院长:「上周数据有更新,重做一遍。」
2 小时又过去了。
这是医院周报的典型困境——「数据 + 排版」分离,改数据就要全部重做。
| 现状 | 痛点 |
|---|---|
| Word 排版 | 改数据要重新排版 |
| 截图插图 | 图片模糊,不能交互 |
| 手动复制 | 易错、效率低 |
| 一次性输出 | 无法复用,每月重做 |
[!quote] 狼叔的判断
“Word 是给’人’用的,Python 是给’流程’用的。” 这一期,带你用 Python 一键生成 PDF 报告,数据更新 + 一键重出。
二、工具原理:reportlab + matplotlib 是什么?
2.1 reportlab 是什么?
[!info] reportlab 简介
reportlab 是 Python 最强大的 PDF 生成库,支持文字、表格、图表、图像、模板。江湖地位:
- Python PDF 生成 #1 库(90% 场景)
- 银行对账单、保险单、医院报告的「标配」
2.2 核心类
1 | SimpleDocTemplate → PDF 文档对象 |
2.3 reportlab vs Word 对照
| 操作 | Word | reportlab |
|---|---|---|
| 文档对象 | .docx |
SimpleDocTemplate |
| 段落 | 输入文字 | Paragraph |
| 表格 | 插入表格 | Table + TableStyle |
| 字体 | 选字体 | setFont('SimSun', 12) |
| 颜色 | 选颜色 | setFont('SimSun', 12, color='red') |
| 页眉页脚 | 复杂 | PageTemplate |
| 图片 | 插入图片 | Image |
三、医院实战:3 大场景
3.1 安装与准备
1 | pip install reportlab matplotlib pandas |
1 | from reportlab.lib.pagesizes import A4 |
3.2 场景一:基础 PDF 报告
[!example] 实战 ①:基础报告
1 | def 生成基础报告(): |
3.3 场景二:含图表的 PDF 报告
[!example] 实战 ②:含图表报告
1 | def 生成图表(数据, 输出图片): |
3.4 场景三:完整院长周报(终极实战)
[!example] 实战 ③:完整院长周报
包含:封面 + 摘要 + 多张图表 + 多张表格 + 分页 + 页眉页脚
1 | def 生成完整院长周报(首页数据, 错误数据, 趋势数据): |
四、避坑指南:5 个让 reportlab「失败」的常见错误
[!warning] 雷区 ①:中文显示为方块
症状:PDF 里中文是「□□□」。
解决:注册中文字体 + 在 Paragraph 里指定fontName:
1
2 pdfmetrics.registerFont(TTFont('SimHei', 'simhei.ttf'))
Paragraph('中文', ParagraphStyle('S', fontName='SimHei'))
[!warning] 雷区 ②:表格列宽不够,内容换行乱
症状:表格文字「主诊错误率」被截断成「主诊错」。
解决:用 Paragraph 包裹表格单元格:
1
2 from reportlab.platypus import Paragraph
表 = Table([[Paragraph('主诊错误率', 中文样式), ...]])
[!warning] 雷区 ③:图片太大,PDF 卡顿
症状:PDF 几十 MB,打开慢。
解决:DPI 200 就够,不要 600:
1 plt.savefig('图.png', dpi=200)
[!warning] 雷区 ④:页眉页脚不显示
症状:首页/末页没页眉页脚。
解决:用onFirstPage和onLaterPages:
1
2
3
4
5
6 def 页眉(canvas, doc):
canvas.saveState()
canvas.setFont('SimHei', 9)
canvas.drawString(2 * cm, 29 * cm, '医院质量管理 · 周报')
canvas.restoreState()
doc.build(故事, onFirstPage=页眉, onLaterPages=页眉)
[!warning] 雷区 ⑤:
matplotlib图没关,内存泄漏
症状:生成 100 张图后,内存占满。
解决:每张图加plt.close():
1
2 plt.savefig('图.png')
plt.close() # 关键!
五、把 PDF 生成嵌入自动化
[!TIP] 完整工作流
- 每周一 02:00(任务计划程序):脚本自动跑
- 从 SQL 读数据(承第 09 期)
- 生成图表(承第 16 期)
- 生成 PDF(本期)
- 自动发邮件给院长 + 科主任
效果:周一早上院长醒来,周报已经在邮箱。
六、下期预告
[!quote] 第 21 期
Python 综合:首页质控全流程自动化 —— 一个脚本搞定所有这一期,把第 14-20 期的所有 Python 技能串起来,搭建一个完整的「首页质控自动化流水线」。
[!TIP] 互动
如果你觉得这篇「医数智联·第 20 期」对你有用,请点赞、在看、转发给科里的同事。文中 PDF 生成脚本、模板、字体包,我已经整理成「PDF 自动生成工具包」。点击「阅读原文」可直接下载。
我是白衣狼,一个用数字化工具把医院管理做「轻」的实战派。咱们下期见。





