Python自动生成PDF和Word文档应选对库并理清模板逻辑:Word用python-docx替换.docx模板中的{字段};PDF按需选pdfkit(HTML转PDF)或ReportLab(精确排版)。

用Python自动生成PDF和Word文档,核心在于选对库、理清模板逻辑、批量处理时注意路径和数据映射。不需要写复杂GUI或部署服务,几行代码就能把Excel里的客户信息变成百份合同或报告。
Word批量生成:python-docx + 模板占位符
最稳的方案是准备一个Word模板(.docx),里面用{姓名}、{日期}这类大括号标记可替换字段。python-docx不支持直接渲染复杂样式,但读取、替换、保存非常可靠。
- 用Document("template.docx")加载模板,遍历所有段落和表格单元格,用.text.replace("{姓名}", "张三")做字符串替换
- 表格里替换要特别注意:先定位到table.cell(row, col).paragraphs[0].text,再替换,避免漏掉隐藏换行符
- 批量生成时,建议用os.path.join(output_dir, f"合同_{i+1}.docx")规范输出路径,防止中文乱码或权限问题
PDF生成:从简单到可控的三种路径
PDF生成分两类需求:一类是“把文字转成干净PDF”,适合报告、清单;另一类是“带样式/页眉页脚/多栏排版”,接近正式出版物。别一上来就啃ReportLab。
- 纯文本/简单表格 → pdfkit(推荐):基于wkhtmltopdf,写个HTML模板(用Jinja2渲染),再调pdfkit.from_file("report.html", "out.pdf")。中文字体需在CSS里指定@font-face并确保系统有该字体文件
- 精确控件位置 → ReportLab:适合发票、证书等固定版式。用逐个画元素,坐标单位是点(1/72英寸),记得y轴从下往上增长
- 已有Word转PDF → python-docx + win32com(Windows)或libreoffice命令行(Linux/macOS):跨平台稍麻烦,但能100%保留原格式,适合签章前终稿转换
数据驱动+批量逻辑:别硬编码循环
真正省时间的是让一份脚本跑完全部文档,而不是手动改100次变量。关键是把数据源(CSV/Excel/数据库)和文档逻辑解耦。
- 用pandas.read_excel("data.xlsx")读客户表,用df.iterrows()逐行生成,每行对应一个文档
- 给每个输出文件命名加业务标识:f"报价单_{row['客户编号']}_{row['日期'].strftime('%Y%m%d')}.pdf"
- 加异常捕获:某条数据缺失字段时,用try/except跳过并记录日志,别让整个批量任务卡死
避坑提醒:中文字体、路径、样式一致性
90%的问题出在环境细节,不是代码逻辑。
- Windows上python-docx默认用宋体,Linux可能显示为方块——在模板里提前设置好中文字体,或用run.font.name = "SimSun"显式指定
- 相对路径容易在IDE和终端执行时不一致,统一用Path(__file__).parent / "templates"(pathlib)获取脚本所在目录
- PDF里中文乱码?pdfkit必须配--enable-local-file-access参数,且HTML中和CSS字体声明缺一不可









