JavaScript (Node.js) 中的 PDF 生成:库与工具概述
创建 PDF 文档是 Web 开发中的常见任务之一。无论是生成发票、报告、证书,还是仅仅导出数据,Node.js 都提供了几种强大的解决方案。在本文中,我们将探讨用于在 JavaScript 服务器端处理 PDF 的主要库、它们的功能以及使用示例。
为什么要在服务器上生成 PDF?
在服务器端(Node.js)生成 PDF 具有以下优点:
- 一致性 — 文档在所有设备上看起来都一样
- 安全性 — 数据不会离开服务器
- 自动化 — 可以按计划或在特定事件发生时创建 PDF
- 支持复杂逻辑 — 可以访问数据库、文件系统和其他资源
Node.js 中用于生成 PDF 的主要库
1. PDFKit
PDFKit — 最流行的从零开始创建 PDF 的库。它不需要外部依赖,并允许完全控制文档内容。
使用示例:
const PDFDocument = require('pdfkit');const fs = require('fs');
const doc = new PDFDocument();doc.pipe(fs.createWriteStream('output.pdf'));
// 添加内容doc.fontSize(25).text('你好,世界!', 100, 100);doc.fontSize(12).text('这是使用 PDFKit 创建的 PDF。', 100, 150);
// 画一条线doc.moveTo(100, 200).lineTo(500, 200).stroke();
// 完成文档doc.end();功能:
- 添加不同字体和大小的文本
- 插入图像(JPEG、PNG)
- 绘制线条、矩形和圆形
- 支持链接和书签
- 创建多页文档
2. Puppeteer
Puppeteer — 一个用于控制 Chrome/Chromium 浏览器的工具。它允许从 HTML 页面生成 PDF,这对于复杂布局非常方便。
使用示例:
const puppeteer = require('puppeteer');
async function generatePDF() { const browser = await puppeteer.launch(); const page = await browser.newPage();
await page.setContent('<h1>标题</h1><p>文档文本</p>'); await page.pdf({ path: 'page.pdf', format: 'A4' });
await browser.close();}
generatePDF();特点:
- 支持 CSS、JavaScript 和所有现代 Web 技术
- 非常适合将 HTML 模板转换为 PDF
- 可以使用指定参数(格式、边距、缩放)进行打印
- 需要安装 Chromium(约 300 MB)
3. jsPDF(适配 Node.js)
jsPDF — 一个客户端库,但存在用于在 Node.js 中使用的封装(例如 jspdf-autotable)。
示例(使用 jspdf 和 html2canvas):
const { jsPDF } = require('jspdf');const fs = require('fs');
const doc = new jsPDF();doc.text('来自 Node.js 的问候!', 10, 10);doc.save('output.pdf');限制: jsPDF 不支持复杂布局,并且需要额外的库来处理 HTML。
4. pdfmake
pdfmake — 一个基于 JSON 格式声明式描述文档的库。
示例:
const pdfmake = require('pdfmake');const fs = require('fs');
const fonts = { Roboto: { normal: 'fonts/Roboto-Regular.ttf', bold: 'fonts/Roboto-Medium.ttf' }};
const printer = new pdfmake(fonts);
const docDefinition = { content: [ { text: