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 和西里尔字母(通过加载字体)
- 既可在客户端也可在