解压并转换HTML为pdf
银行承兑汇票 transBill_info_*.zip / *.rar → A4 干净 PDF 的一键工具。
文件组成
| 文件 | 作用 |
|---|---|
承兑转PDF.bat |
一键入口(双击或拖拽压缩包到它上面) |
transbill_to_pdf.py |
核心脚本(解压 → Edge 转 PDF → 去空白页 → 清理) |
SKILL.md |
本说明 |
运行依赖(本机已具备)
- Python 3 且装有
pymupdf(脚本 import pymupdf,缺则回退 import fitz)
- 本机固定调用:C:\Users\DHCW\.workbuddy\binaries\python\envs\default\Scripts\python.exe
- 换机器时把 bat 里的 python 路径改成目标机器的 python 即可 - Edge / Chrome(headless 打印引擎),候选路径见脚本
EDGE_CANDIDATES - WinRAR(仅 rar 需要,
UnRAR.exe),zip 不需要
用法
- 双击 bat:自动处理 bat 同目录下所有
*.zip/*.rar - 拖拽压缩包到 bat 上:只处理拖入的那一个
- 命令行:
python transbill_to_pdf.py "xxx.zip" "yyy.rar"
输出:在压缩包同目录生成 <html名>.pdf(与压缩包内 html 同名),A4。
转换规则(已固化的关键参数,勿随意改)
- 纸张 A4:注入
@page{size:A4;margin:0 20mm}。默认 Edge headless 输出 Letter(216×279mm),必须注入才对齐 A4。 - 去掉背景图:注入
.transparent{background-image:none !important;background:none !important}。背景是浅色边框花纹 + 灰色水印大图,去掉后只剩文字表格 + 左上 logo(logo 是<img>标签,不受影响)。 - 票据朝上:注入
.transparent{margin-top:-6mm !important},实测内容顶部 18mm → 12mm,且各页顶部对齐。
- 安全上限是 -6mm。设 -10mm 会内容溢出破坏分页(实测 34 页被挤成 1 页)。 - 删空白页:HTML 末尾常有
page-break-after:always多出纯空白页,用 PyMuPDF 按「0 文本且 0 图片」检测删除。 - 自动清理:转完后删除解压出的中间目录(
shutil.rmtree),目录只留压缩包 + PDF + 脚本。
兼容性处理(踩过的坑)
- zip 中文文件名:银行 zip 内文件名可能按 cp437 存,需无 UTF-8 标志时尝试
cp437→gbk/utf-8还原,否则解出乱码文件名。 - rar 输出乱码:UnRAR 控制台输出是 GBK,subprocess 需
encoding='utf-8', errors='replace',否则中文路径/输出解码报错。 - Edge headless 进程残留:
--user-data-dir用独立临时目录,转完进程可能不退出并锁目录 → 脚本_kill_headless按 profile 名强杀(PowerShell 命令),profile 放系统 temp。 - 临时文件放系统 temp(
tempfile.mkdtemp),不在数据目录留._tmp.html/._raw.pdf残留。 - bat 防注入:终端安全软件(迪台博隔离墙)会破坏带
set变量 / 中文 echo 的 bat。bat 必须写成最简结构:不用 set/变量/if,硬编码 python 绝对路径,echo 用纯 ASCII。
验证方式
转完用 pymupdf 检查输出:
- 页数 = 有效票面/背书页数(无末尾空白页)
- 每页尺寸 ≈ 595×842 pt(A4)
- 每页仅 1 个图片块(logo)、无大块背景图
- 各页内容顶部 ≈ 12mm(均匀靠上)
边界
- 只处理含
.html/.htm的压缩包;无 html 则跳过。 - 不读取、不记录、不外传票据正文内容(号码/金额/背书链等票面详情)。本工具只做格式转换,票据详情严禁写入任何记忆或文档。