跳到正文
← 全部文章

开发笔记 · 2026年9月10日 · 1 分钟读完

做一个值得信赖的 PDF 引擎

预览即产品:Invoice Maker 如何用 Core Graphics 渲染矢量 PDF,让所见即所得不是口号。

Read in English →

在发票应用里,预览就是产品。只要送到客户手里的 PDF 和你在屏幕上看到的差了一个点的间距,信任就没有了。所以 Invoice Maker 只围绕一条规则构建:唯一的渲染器,唯一的事实来源。

只有一个渲染器

UIGraphicsPDFRenderer 负责绘制最终文档,屏幕上的预览通过 PDFKit 渲染同一份文档。不存在会各自漂移的第二条代码路径——所见即所得是结构保证,不是纪律要求。

排版循环

每张发票都是一个测量问题:

  1. 用真实字体度量逐行测量行高;
  2. 只在行边界分页;
  3. 每一页都重复表头、重新编号页脚。

多页发票看起来是排过版的,而不是钉在一起的。

底层的数学

金额由纯函数计算引擎完成——折扣分摊到行、逐行税率覆盖优先、部分收款冲抵余额——并由 111+ 单元测试护航。中英文大写金额(壹佰贰拾元整 / One Hundred Twenty)从同一组数字生成,永远不需要手打两遍。

我们刻意没做的事

没有 HTML 转 PDF。没有内嵌网页。没有服务端渲染。Core Graphics 原生绘制的矢量 PDF,屏幕上和纸面上同样锐利,离线可用,不泄露任何东西——这正是一个隐私优先的工具该有的样子。