
本文翻译自:
https://dzone.com/articles/angular-vs-react-vs-vue-which-framework-is-best-to
在本文中,我们将讨论用于生成PDF的一系列JavaScript库。
我们将通过研究实际的用例来比较,并且主要关注这5个方面:
运行环境 支持的模块 输入 自定义字体 易用性
阅读之后,你将能够为你的JavaScript应用程序找到合适的PDF库。
1. PDFKit
PDFKit是在庞大的JavaScript生态系统中发布的首批pdf库之一。自2012年推出以来,就广受欢迎,并且到2021年仍在更新。
与其他库相比,PDFKit使用起来稍显困难,因为它通过Webpack为Node和浏览器提供支持。
正如我们将在之后的比较中看到的那样,有些PDF库是PDFKit的包装器。
它支持自定义字体和图像嵌入,但是缺少高级API。
此外,文档往往很复杂。
正如你所料,你可能需要一定的时间才能习惯,因此刚开始的时候,你会觉得设计PDF并不是一件那么容易的事。
| 评估要点 | 评估结果 |
|---|---|
| 在Node和浏览器上工作 | △(有点复杂) |
| 输入 | ○(绝对输入) |
| 自定义字体 | ○(在浏览器中使用时要小心) |
| 易用性 | △(有点复杂) |
官方网站:
https://pdfkit.org/
2. pdfmake
pdfmake是一个围绕PDFKit构建的包装器库。主要的区别在于编程范例:
PDFKit采用经典的命令式样式,而pdfmake具有声明式方法。
这就是为什么pdfmake可以让你更轻松地专注于自己想做的事情,而不是花时间告诉库如何获得确定的结果。
然而,甘瓜苦蒂,天下物无全美,当你尝试使用Webpack嵌入自定义字体时,你可能会遇到问题。
遗憾的是,网络上并没有太多关于此问题的文档。相反,如果你不使用Webpack,则可以轻松克隆git存储库并运行字体嵌入脚本。
| 评估要点 | 评估结果 |
|---|---|
| 在Node和浏览器上工作 | △(使用Webpack时要小心) |
| 输入 | ○(绝对输入) |
| 自定义字体 | △(需要自己构建) |
| 易用性 | ○ |
官方网站:
http://pdfmake.org/
3. jsPDF
jsPDF在GitHub的pdf库中启动次数最多,这并非偶然,因为它非常稳定且维护良好。
它的模块根据AMD模块标准导出,方便了我们在node和浏览器中的使用。
对于PDFKit,因为提供的API具有强制性模式,所以导致创建复杂的布局往往非常困难。
嵌入字体倒是不难,但是需要额外的一个步骤:将字体转换为TTF文件。
jsPDF不是最容易掌握的一个库,但是其文档非常丰富,因此我们在使用它时不会遇到任何特别的阻碍。
| 评估要点 | 评估结果 |
|---|---|
| 在Node和浏览器上工作 | ○ |
| 输入 | ○ |
| 自定义字体 | ○(需要转换为ttf文件) |
| 易用性 | △(有点复杂) |
官方网站:
https://github.com/MrRio/jsPDF
4. Puppeteer
正如你知道的,Puppeteer是一个Node库,它提供了用于控制Chrome的高级API,但是它也可以用于创建PDF。
模板必须用HTML编写,这使得Puppeteer非常适合web开发人员使用。
关于Puppeteer在开发过程中的使用,可以参考:Generate a PDF from HTML with puppeteer
https://dev.to/damcosset/generate-a-pdf-from-html-and-back-on-the-front-5ff5
Puppeteer主要有两个缺点:
需要实现后端解决方案。 每次需要创建PDF时都需要启动Puppeteer,这会增加一些开销。太慢了。
如果上面列出的缺点对你而言不是一个大问题,那么Puppeteer或许是一个不错的选择,尤其是在你需要设计HTML表等的情况下。
| 评估要点 | 评估结果 |
|---|---|
| 在Node和浏览器上工作 | x |
| 输入 | - |
| 自定义字体 | ○(web字体) |
| 易用性 | ? |
官方网站:
https://github.com/puppeteer/puppeteer
5. pdf-lib
pdf-lib是一个完全用Typescript实现的PDF库,就像pdfmake一样,它也是围绕PDFKit而构建的。
尽管它是在其他库之后发布的,但它在GitHub上依然受到了数千star的欢迎。
API的设计很棒,并且可以同时使用:node和浏览器。
它支持PDF合并、拆分、嵌入,且具有许多其他库所没有的功能;pdf-lib非常强大,使用也非常简单。
最热门的功能之一是对嵌入字体文件的Unit8Array和ArrayBuffer支持,如果你使用的是node,则允许使用fs;如果你使用的是浏览器,则可以使用xhr。
当你将其与其他库进行比较时,你可以感受到它在性能方面的优越性,而且,它还可以与Webpack一起使用。
此外,该库采用命令式方法,并且可以推断,使用复杂的布局并不是一件容易的事。
| 评估要点 | 评估结果 |
|---|---|
| 在Node和浏览器上工作 | ○ |
| 输入 | ○ |
| 自定义字体 | ○ |
| 易用性 | △(有点复杂,需要计算布局) |
官方网站:
https://pdf-lib.js.org/
6. labelmake
最后一个是Labelmake,一个pdf-lib的包装器库。我个人亲自开发了此库,目的是使Pdf-lib尽可能的具有声明性。
与pdf-lib相反,labelmake不需要开发人员自己计算布局:无需定义每次的对齐,行高等。
你可以在此处查看代码示例。
https://labelmake.jp/javascript-pdf-generator-library/example/
借助pdf-lib的优势,例如可以将Uint8Array和ArrayBuffer用于字体数据,以及可以嵌入PDF文件的功能,labelmake允许开发人员高效地创建复杂的布局。
| 评估要点 | 评估结果 |
|---|---|
| 在Node和浏览器上工作 | ○ |
| 输入 | ○ |
| 自定义字体 | ○ |
| 易用性 | ○ |
官方网站:
https://labelmake.jp/javascript-pdf-generator-library
(文本完)

每日分享前端插件干货,欢迎关注!
点赞和在看就是最大的支持❤️




