JavaScript (Node.js) 中的 PDF 生成:用于创建 PDF 的库和工具

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

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

开始课程

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 简单,可在客户端和服务器端运行。

缺点:

推荐