11 天前我把 V1.1-beta 推上去了。
那天晚上看下载量从 0 涨到 27,不是火,是冷启动。但更难受的是评论里有 3 个人问同一个问题:你这个 799MB 是不是有问题?
是的,是 799MB。
我做的叫印流PDflow,本地 PDF 工具。V1.1-beta 跑通了:合并拆分、压缩、转换、模板排版。技术上是能跑。但"能跑"和"能发布"完全是两码事。
799MB 这个数字把我按在地上摩擦了。
更要命的是,里面 350MB 是 Qt6WebEngine,我项目根本没用这玩意。
11 天前我按下「重新设计」。
砍包 3 天
PyInstaller 默认会把 Qt 所有模块都打进去,WebEngine、3D、Multimedia、Network、Sql 一堆我根本没用。
pyinstaller --noconfirm \
--exclude-module=PySide6.QtWebEngineCore \
--exclude-module=PySide6.QtWebEngineWidgets \
--exclude-module=PySide6.Qt3DCore \
--exclude-module=PySide6.QtMultimedia \
--exclude-module=PySide6.QtNetwork \
main.py
砍完 8 个模块,1.1GB → 540MB。
然后换成 onedir + NSIS LZMA 高压缩,540MB → 247MB。
最后用字体白名单(项目只用 3 个字体),247MB → 211MB。
3 天,799 → 211。
不是某个 spec 跑出来的,是 NSIS 包装后用户实际下载的那个安装包。
OCR 选型又卡了 3 天
V1.2 计划加 PDF→Excel,需要 OCR。
试了 3 个:
- Tesseract:800ms/页,太慢,pass
- PaddleOCR:400ms/页,但装上 ONNX 依赖瞬间胖 200MB,我前面白砍了
- RapidOCR:200ms/页,准确率低 5%,但轻
最后选 RapidOCR。
理由说出来有点反常识:本地 PDF 工具,速度比准确率重要。用户最痛的不是"识别错一个字",是"等 30 秒还没完"。
PaddleOCR 我装上又卸了 4 次,每次编译 5 分钟。认输。
6 个模板的反直觉教训
V1.2 加了 6 个模板:名片、合同协议、发票收据、单页公告、产品规格、分析报告。
技术上看不难——选模板、填表单、导出 PDF。
但我卡在「实时预览」上卡了 2 天。
预览和最终导出的图必须像素级一致。不一致的话用户填完表单导出,会发现"咦怎么跟我看到的不一样"。这种体验比"丑"更要命。
最后改了一个东西:预览和导出走同一套渲染管线。
def render_template(template, data, output):
layout = build_layout(template, data) # 同一个 layout 函数
if output.endswith('.pdf'):
return render_pdf(layout)
return render_png(layout) # 预览
屏幕看到啥,导出就是啥。
这个改完以后,我加新格式(Word、图片)都自动支持预览。
另一个反直觉的事:正反面切换。
名片要正反两个面。最初做了 3 个方案:双击卡片、右侧 Tab、滑动。选了最简单的双击。结果用户根本发现不了。
最后把「切换」按钮挪到预览图旁边,加了文字提示。
重要的功能不要藏起来。为了"简洁"牺牲发现率,是本末倒置。
体积优化的彩蛋
最后一个加分项:图片保真嵌入。
很多 PDF 工具嵌入图片会重新编码(压缩 + 转码),放大就糊。设计师最恨这个。
PyMuPDF 有个参数:
# 不推荐(重新编码)
page.insert_image(rect, filename="logo.png")
# 推荐(保持原格式)
page.insert_image(rect, filename="logo.png", keep_image_format=True)
用户导出的 PDF 里图片放大仍是清晰的。
11 天后的数字
| V1.1-beta | V1.2 | |
|---|---|---|
| 安装包 | 799MB | 211MB |
| 模板 | 0 | 6 |
| OCR | 无 | RapidOCR |
| 启动 | 5s | <3s |
减重 74%。
收尾:
印流PDflow V1.2 已经放在 yinliupdflow.com。
不需要 Python 环境,211MB 双击装完即用。纯本地,数据不出电脑。
GitHub:github.com/jiuyue1024/PDflow (项目本身不开源,欢迎 issue 和 star)
最后问一句:你做工具类软件,砍包、砍功能、砍时间,最让你头疼的是哪个?
(写不动了,先这样)