Jasper花了一年时间,用Rust从零写了一个PDF引擎。不是包装现有的C++库,也不是fork开源项目——48个纯Rust crate,零C或C++依赖。SDK已经稳定,免费桌面编辑器的新版本下周发布。他在技术博客里复盘了这一路踩过的坑。
第一个坑:XFA表单
![]()
Adobe在PDF 2.0中弃用了XFA,但弃用不等于消失。XFA有自己的布局模型、脚本语言和数据绑定,全部记录在一份756页的规范文档里。实现它意味着要写一个JavaScript解释器(QuickJS)来处理表单计算,同时还要确保文档中的脚本永远不会执行。
第二个坑:渲染
现有的Rust PDF crate只能解析文件,Jasper不得不基于vello_cpu自己构建光栅化器。最初的PDF/A转换通过了验证,却悄悄丢内容——验证器检查的是结构,不检查文本是否保留。他通过用mutool对比原文字数才抓到这个bug:一个转义的反斜杠,就丢掉了一整页内容。
测试的坑:看似通过,实则没测
处理了50,000份真实PDF零崩溃之后,Jasper在5,000份文档的测试集上测了渲染性能,在另外1,000份文档的保留集上测了PDF/A合规性。这些数字可以用veraPDF和mutool对照已发布的基准复现。
但测试本身也有问题。WebAssembly构建里的一个绑定从5月就坏了——测试存在,但没在CI里跑,和另外198个方法测试一样闲置着。现在,任何东西没有在流水线里跑过测试就不能发布。
还有三个"通过"的测试其实什么都没测:一个用ASCII夹具,永远走不到Unicode路径;另一个把未压缩流计为零;第三个把文本放在检测不到块的位置。现在的规则是:故意把函数弄坏,看测试套件能不能发现。
静默跳过的测试也藏了问题。一个重复的字符映射表存活了很久,因为缺失的夹具静默失败了。现在任何跳过都必须记录到stderr。
隐私设计:三个出站连接
编辑器只有三个出站连接:更新检查、可选的崩溃报告、在浏览器中打开链接。文档内容永远不会离开你的机器。你可以自己验证这一点。局限在于:TLS会掩盖内容,未发布的源码无法验证。你也可以对任何PDF工具做同样的检查来对比结果。
新版编辑器与SDK
新版本移除了不起作用的电子签名控件,修复了保存状态指示器。编辑器对所有用途免费,无账号、无遥测。SDK许可证起价€699,提供30天评估期。SDK所有功能全开,但在应用许可证密钥之前,输出会加水印。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.