定义
pdfmake是一个用纯 JavaScript 编写的 PDF 文档生成库,既能运行在浏览器中,也能运行在 Node.js 服务端。[1] 它的核心思路是声明式排版:使用者提供一个称为文档定义对象(document-definition-object)的 JavaScript 对象,在其中描述文档的内容、样式与页面参数,由库负责计算位置并输出 PDF 文件。
该库基于另一个 JavaScript PDF 库 pdfkit 开发,源码以 MIT 许可证开放,文档站点与源码仓库分开维护。[2] 在浏览器端使用时,通常需要同时引入库文件和一份虚拟文件系统形式的字体定义文件,默认内置 Roboto 字体。[3]
原理
pdfmake采用声明式而非命令式的排版模型。使用其他一些 PDF 库时,开发者往往需要调用类似 writeText(text, x, y)、moveDown 这样的命令手工指定每段文字的位置;pdfmake则让使用者只描述内容与样式,把坐标计算交给内部的布局引擎。 文档定义对象中最基本的键是 content,其值可以是一个字符串,也可以是由段落、表格、列表、图片、画布等节点组成的数组或嵌套结构。
文档定义对象还包含若干并列的配置项:styles 用于定义可复用的样式字典并支持样式继承,header 与 footer 用同一套语法描述页眉页脚,background 用于设置每页的背景层,pageSize、pageOrientation、pageMargins 控制页面尺寸、方向与页边距,info 则写入标题、作者、主题等 PDF 元数据。 页眉页脚既可以是静态内容,也可以传入函数,依据当前页码、总页数和页面尺寸动态生成;表格支持自动宽度、固定宽度、星号宽度与百分比宽度,并支持列合并、行合并,以及跨页时自动重复表头。[1]
布局完成后,客户端通过 createPdf 方法得到文档生成器,再调用 download、open、print 等方法完成下载、新窗口打开或打印,也可以取回数据链接、Base64 字符串、Buffer 或 Blob 形式的二进制结果。 在 0.3 版本中,虚拟文件系统的字体数据改为在使用前一次性注册到 pdfmake 实例上,而不再随 createPdf 调用传入。[4]
发展历程
pdfmake的源码仓库位于代码托管平台 GitHub,由 bpampuch 发起并与 liborm85 等人共同维护,早期版本可在 npm、Bower、Packagist 等多个软件包仓库中获取。[5] 项目先后形成 0.1.x、0.2.x 和 0.3.x 三条主要分支:0.1.x 与 0.2.x 长期作为稳定版本使用,0.3.x 曾以 beta 形式发布较长时间后才转为正式版本。[6]
0.3.0 于 2026 年 1 月 1 日发布,相较 0.2.21 有多项不兼容改动:代码回到原始 pdfkit 包而不再使用 @foliojs-fork 分支,代码库迁移到 ES6 以上语法,客户端与服务端接口统一,原本接收回调的方法改为返回 Promise,客户端虚拟字体存储的引入方式也发生变化。[7] 该版本同时放弃对 Internet Explorer 11 的支持,并将 Node.js 的最低支持版本提高到 20 LTS。[7]
0.3 系列此后的版本继续增添功能并修补问题。0.3.5 为列加入蛇形排列(snakingColumns)属性以形成报纸式分栏,并为文本节点增加大纲与书签(outlines)相关属性;0.3.4 为表格单元格加入垂直对齐;0.3.6 增加外部地址访问策略设置方法,用以限制下载字体或图片时允许访问的域名。[8]
参考资料
- pdfmake [引用日期2026-10-14]
- Packagist The PHP Package Repository [引用日期2026-10-14]
- Client-side [引用日期2026-10-14]
- pdfmake upgrade notice (0.2 → 0.3) [引用日期2026-10-14]
- README [引用日期2026-10-14]
- pdfmake on NPM [引用日期2026-10-14]
- pdfmake 0.3.0 on Node.js NPM [引用日期2026-10-14]
- Changelog [引用日期2026-10-14]