JavaScript (Node.js) 中的 PDF 生成:库与工具

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JavaScript (Node.js) 中的 PDF 生成:库与工具



PDF 文档生成是 Web 开发中的常见任务之一。发票、报告、证书、票据——这些都可以方便地在服务器端创建。在 Node.js 生态系统中,有几种成熟的解决方案,每种都适用于特定的场景。在本文中,我们将探讨三种主要方法以及用于在 JavaScript 中创建 PDF 的流行库。



流行库概览



工具的选择取决于文档的复杂程度:简单的文本报告、数据表格,还是复杂的 HTML+CSS 布局。以下是三个关键库。



1. PDFKit — 低层级 PDF 操作



PDFKit 是最流行的“从零开始”创建 PDF 的库。它允许您使用坐标网格绘制文本、线条、矩形和图像。非常适合需要精确定位的动态文档。



PDFKit 的优势:

  • 完全控制页面的每个元素
  • 无需浏览器或 Puppeteer
  • 支持嵌入字体 (TrueType, OpenType)
  • 支持异步流操作 (Stream API)


简单文档示例:



const PDFDocument = require('pdfkit');const fs = require('fs');

const doc = new PDFDocument();doc.pipe(fs.createWriteStream('output.pdf'));

// 标题doc.fontSize(25).text('你好,PDFKit!', 100, 100);

// 普通文本doc.fontSize(12).text('这是一个使用 Node.js 创建的简单 PDF 文档。', 100, 150);

// 画一条线doc.moveTo(100, 200).lineTo(500, 200).stroke();

// 添加图片doc.image('logo.png', 100, 220, { width: 100 });

doc.end();


2. Puppeteer — 从 HTML/CSS 生成



Puppeteer 是一个用于控制无头 Chrome 浏览器的库。它允许您加载 HTML 页面(或动态生成页面)并将其保存为 PDF。如果您已有 HTML 模板或复杂的 CSS 样式,这是最佳选择。



Puppeteer 的优势:

  • 精确渲染 CSS (flex, grid, 字体)
  • 支持页面上的 JavaScript (图表, 表格)
  • 可设置页面格式、边距、页眉页脚
  • 非常适合报告和发票


从 HTML 生成 PDF 的示例:



const puppeteer = require('puppeteer');

(async () => { const browser = await puppeteer.launch(); const page = await browser.newPage();

const html = `<!DOCTYPE html> <html> <head><style> body { font-family: Arial; padding: 20px; } h1 { color: #2c3e50; } table { border-collapse: collapse; width: 100%; } td, th { border: 1px solid #ccc; padding: 8px; } </style></head> <body> <h1>月度报告</h1> <table> <tr><th>商品</th><th>数量</th></tr> <tr><td>笔记本电脑</td><td>5</td></tr> <tr><td>鼠标</td><td>10</td></tr> </table> </body></html>`;

await page.setContent(html); await page.pdf({ path: 'report.pdf', format: 'A4', printBackground: true });

await browser.close(); console.log('PDF 已创建!');})();


3. jsPDF — 客户端(及 Node.js)生成



jsPDF 最初是为浏览器设计的,但也有 Node.js 版本。它轻量级,非常适合简单的文档。在 Node.js 中,通过 jspdf 包及额外依赖项使用。



jsPDF 的优势:

  • 体积小
  • 支持 Unicode 和西里尔字母(通过加载字体)
  • 既可在客户端也可在

推荐