业绩证明合同+备案贴图生成 Word
功能概述
把多个项目的「合同 PDF + 备案/二维码」拼成一个 Word 文档,按给定顺序排列:
- 合同:每页 4 张截图(2x2 网格),只设宽度不设高度,避免拉伸变形
- 备案/二维码:每页 1 张
- 页边距:上下 2.54cm、左右 3.18cm(A4 常规布局)
- 项目标题:每个项目以「序号. 项目名称」开头,仅标题处写名称,不在每张图上方重复
前置依赖
pip install PyMuPDF python-docx Pillow
校验:
import fitz, docx, PIL
工作流程
Step 1: 确认文件来源
两种常见目录结构:
业绩证明/
├── 合同/
│ ├── 项目甲.pdf ← 合同 PDF
│ └── 项目乙.pdf
└── 备案二维码/
├── 备案回执-项目甲.pdf ← 备案回执(PDF 或图片均可)
└── 备案回执-项目乙.pdf
合同与备案文件命名通常含完整项目名,脚本靠文件名关键词匹配。
Step 2: 修改脚本配置
编辑 scripts/generate_doc.py 顶部「配置区」:
CONTRACT_DIR/FILING_DIR:合同、备案/二维码所在文件夹OUTPUT_DOCX:输出 Word 完整路径PROJECTS:项目列表,每项(项目名称, 合同文件名, 备案文件名),
缺失项填None(Word 中自动留空页并提示)
Step 3: 运行
python scripts/generate_doc.py
脚本自动:匹配文件 → PDF 转图片 → 拼版生成 Word → 校验嵌入结果。
Step 4: 批量从 Excel 匹配(可选)
当项目很多且来自 Excel 名单时,先用 pandas 读名单,再按项目名
在文件夹里做关键词匹配(见脚本 match_project 思路:完整名 → 去后缀名
→ 前 30 字 → 前 20 字逐级放宽),把结果填进 PROJECTS 即可。
关键坑点(实测)
坑1:PyMuPDF 和 PIL 在中文路径下保存图片静默失败
pix.save(path) 和 PIL.Image.save(path) 在含中文的路径下都可能
静默失败产生 0 字节文件,导致后续 add_picture 报
UnrecognizedImageError。
最可靠方案:pix.tobytes("png") 取原始字节 + open(path,'wb').write() 直接写;
且临时文件用 tempfile 生成纯英文路径,天然规避中文路径问题:
pix = page.get_pixmap(matrix=fitz.Matrix(2.0, 2.0), alpha=False)
data = pix.tobytes("png")
tmp = tempfile.NamedTemporaryFile(suffix=".png", delete=False)
tmp.write(data); tmp.close()
para.add_run().add_picture(tmp.name, width=Cm(6.8))
坑2:python-docx 同时设宽高导致图片拉伸
add_picture(path, width=X, height=Y) 会强制拉伸到指定尺寸。
解决:只指定宽度,高度按原始比例自动计算:
run.add_picture(path, width=Cm(6.8)) # 合同图 4 张/页
run.add_picture(path, width=Cm(14.0)) # 备案图 1 张/页
坑3:重复运行残留 0 字节文件
旧运行失败产生的 0 字节文件可能不被覆盖,导致再次失败。
解决:每次渲染到全新的临时目录/临时文件名(tempfile 每次唯一),
或用后即删。
坑4:文件名笔误导致匹配失败
源文件名可能有错别字(如「资产评估报告」误写成「产评估报告」)。
解决:匹配时逐级放宽关键词,或直接用 find/ls 人工确认文件名后再填入 PROJECTS。
图片尺寸参数
| 参数 | 作用 | 推荐值 |
|---|---|---|
CONTRACT_IMG_W |
合同图宽度 | 6.8cm(两列 13.6cm + 间距 < 可用宽 14.64cm) |
FILING_IMG_W |
备案/二维码图宽度 | 14.0cm |
RENDER_ZOOM |
PDF 渲染缩放 | 2.0(≈200 DPI,清晰且体积适中) |
| 上下边距 | — | 2.54cm |
| 左右边距 | — | 3.18cm |
与 personnel-cert-word 技能的关系
| 技能 | 排列维度 | 内容 |
|---|---|---|
performance-proof-pdf2word(本技能) |
按项目 | 合同 PDF + 备案/二维码 → Word |
personnel-cert-word |
按人员 | 评估师证 + 社保页 + 业绩备案 → Word |