每一家交付专有软件的 PHP 团队,最终都会撞上同一堵墙:事实上的 HTML 转 PDF 标准库 mpdf,采用的是 GPL-2.0-only 许可证。这意味着,将其打包进 OEM 产品、本地部署安装包或任何闭源代码库,要么你得把自家产品放到 GPL 协议下开源,要么去谈商业授权。
开发者 dskripchenko 经常撞上这堵墙,次数多到最终决定动手写一个替代品。于是,php-pdf 出现了。这是一个纯 PHP、采用 MIT 许可的 PDF 工具包。它支持 HTML/CSS 输入、提供了流畅构建器、TTF 字体嵌入与子集化,还能处理条形码、图表、AcroForm、PKCS#7 签名、PDF/A 与 PDF/X 格式,甚至可以读取和合并现有 PDF 文件。
![]()
一个上线仅两周的库,声称具备生产级的密码学能力和 PDF/A 合规性,招来质疑是理所当然的。因此,每次向主分支推送代码时,持续集成管线都会运行一套独立的验证链条来接受检验。PDF/A 的各类参考标准,包括 1a、1b、2b、2u、3b,均交由行业标准验证器 veraPDF 进行校验,而非自研代码。PDF/X 的结构则在字节层面接受检查,再加一轮 Ghostscript 渲染流程。签名的验证由 OpenSSL 命令行完成,它会精准比对 /ByteRange 字节,并且,任何一个被篡改的字节都必须导致验证失败。渲染结果则通过 poppler 与黄金图像进行差异比对。每次运行的报告都是公开制品,可在合规性页面查阅。
对于典型的 mpdf 调用场景,迁移过程几乎是机械式的,只需替换一个引入语句。兼容外观层覆盖了 WriteHTML、AddPage、Output 的全部四种输出目标、元数据设置器以及通用的配置键。迁移指南中给出的示例是经过测试套件验证的真实代码,而非理想化的示意。这份指南还提供了完整的原生 API 映射表,以及针对 Destination::* 常量的查找替换速查表。
这个兼容层刻意回避了 mpdf 特定的 HTML 扩展,例如 pagebreak 和 barcode 标签,以及 SetHeader 快捷方式和字体配置数组。这些功能对应到原生 API 上,实现得反而更好——用真实的块级元素处理页眉页脚,用包含 16 种格式的一等公民 Barcode 元素来生成条码,引擎级别的字体配置也同样就绪。
性能方面也有提升。在一次可复现的基准测试中,采用隔离的子进程运行,取中位数,并且锁定竞争对手的版本——只需从纯净克隆的仓库执行 composer bench 命令即可全程重现。具体数字是:php-pdf 在基准测试中比 mpdf 快了约 42%。完整的测试方法论与四个竞品的对比数据都公开在了基准测试页面上。
这里也有一些坦诚公布的局限。在 HTML/CSS 子集的支持上,部分区域比 mpdf 要窄一些,比如 @page 规则会被映射到 PageSetup 对象。它不会自动嵌入字体:基础 14 种字体能覆盖拉丁字符,但西里尔文、阿拉伯文或中日韩文则需要向引擎传入一个 TTF 字体文件——引擎会自动对其进行子集化。出于审慎,公钥加密功能被刻意搁置,项目方明确表示,不会交付无法用真实测试固件验证的密码学模块。
Laravel 用户也有对应的薄封装桥接层:dskripchenko/laravel-php-pdf。它提供了一个 Pdf 外观以及一个 response()->pdf() 宏。如果 GPL 许可的摩擦对你而言是个绕不过去的现实问题,这里提供了一个完整的、基于宽松许可证构建的路线图。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
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.