JavaScript (Node.js) 中的 PDF 生成:库与工具完全指南
PDF 文档生成是 Web 开发中最常见的任务之一。从创建发票和报告到生成复杂的多页文档,Node.js 提供了强大的 PDF 处理工具。在本文中,我们将介绍在 JavaScript 服务器端创建 PDF 文件的主要库和方法。
为什么要在服务器端生成 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.moveTo(100, 150).lineTo(400, 150).stroke();
// 插入图像doc.image('logo.png', 100, 200, { width: 100 });
doc.end();优点:轻量、快速、支持 Unicode 和西里尔字母、多种字体。
缺点:需要手动布局设置,不支持 HTML。
2. Puppeteer — 从 HTML 生成
Puppeteer 是一个用于控制无头 Chrome 浏览器的库。它可以将 HTML 页面转换为 PDF,并保留所有样式和脚本。
const puppeteer = require('puppeteer');
async function generatePDF() { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.setContent('<h1 style="color: red;">PDF 标题</h1><p>文档文本</p>'); await page.pdf({ path: 'output.pdf', format: 'A4', margin: { top: '20px', bottom: '20px' } }); await browser.close();}
generatePDF();优点:非常适合复杂的 HTML 布局,支持 CSS、JavaScript、字体。
缺点:重量级(需要 Chromium),比其他库慢。
3. pdf-lib — 修改现有 PDF
pdf-lib 专注于编辑现有的 PDF 文档。允许添加文本、图像、填写表单。
const { PDFDocument } = require('pdf-lib');const fs = require('fs');
async function editPDF() { const existingPdfBytes = fs.readFileSync('template.pdf'); const pdfDoc = await PDFDocument.load(existingPdfBytes); const pages = pdfDoc.getPages(); const firstPage = pages[0]; firstPage.drawText('新文本', { x: 50, y: 50, size: 20, color: rgb(0, 0, 0) }); const pdfBytes = await pdfDoc.save(); fs.writeFileSync('modified.pdf', pdfBytes);}
editPDF();优点:轻量、无需外部依赖、与表单配合良好。
缺点:从头创建复杂布局的能力有限。
4. jsPDF — 客户端-服务器端解决方案
jsPDF 最初是为浏览器创建的,但也可以在 Node.js 中运行。适用于简单文档。
const { jsPDF } = require("jspdf");
const doc = new jsPDF();doc.text("Hello world!", 10, 10);doc.save("output.pdf");优点:API 简单,可在客户端和服务器端运行。
缺点:
图书馆中也有
推荐