什么是 pdf-lib,为什么需要它?
pdf-lib 是一个功能强大且轻量级的库,用于在 JavaScript(Node.js 和浏览器)中创建和编辑 PDF 文档。与 Puppeteer 或 jsPDF 等重量级解决方案不同,pdf-lib 无需安装浏览器环境(Chromium),仅基于 PDF 原生结构工作。它非常适合服务器端生成报告、发票、证书以及任何需要对内容(文本、字体(包括嵌入)、图像、表单、注释和页面)进行完全控制的文档。
安装
通过 npm 安装非常简单:
npm install pdf-lib然后将其导入到项目中:
const { PDFDocument, rgb, StandardFonts } = require('pdf-lib');主要功能
- 从零创建 PDF — 添加页面、文本、图像。
- 编辑现有 PDF — 复制页面、在表面插入文本、合并文档。
- 字体处理 — 支持标准字体(Helvetica、TimesRoman)以及嵌入自定义 TTF 字体。
- 绘制形状 — 线条、矩形、椭圆,可设置颜色和透明度。
- 表单和注释 — 创建文本字段、按钮、链接。
- 导出为 Uint8Array — 结果可以保存为文件或发送给客户端。
Node.js 代码示例
创建一个包含标题和图像的简单 PDF:
const { PDFDocument, rgb } = require('pdf-lib');const fs = require('fs');
async function createPDF() { const doc = await PDFDocument.create(); const page = doc.addPage([600, 400]); // 文本 page.drawText('Привет, мир!', { x: 50, y: 350, size: 30, color: rgb(0, 0.53, 0.71), }); // 矩形 page.drawRectangle({ x: 50, y: 200, width: 200, height: 100, color: rgb(0.9, 0.1, 0.1), borderColor: rgb(0, 0, 0), borderWidth: 2, }); // 嵌入图像 (PNG) const imageBytes = fs.readFileSync('logo.png'); const image = await doc.embedPng(imageBytes); page.drawImage(image, { x: 300, y: 250, width: 100, height: 100, }); const pdfBytes = await doc.save(); fs.writeFileSync('output.pdf', pdfBytes);}
createPDF().catch(console.error);何时使用 pdf-lib?
pdf-lib 是最佳选择,如果你在 Node.js(或浏览器)环境中工作,并且需要:
- 无需启动浏览器即可快速生成 PDF(节省内存和时间)。
- 嵌入自定义字体(例如,用于西里尔字母)。
- 编辑现有 PDF(添加水印、合并文档)。
- 创建交互式表单。
如果需要将复杂的 HTML/CSS 渲染为 PDF(这种情况下 Puppeteer 更合适)或处理大量数据(重 PDF 可能会降低性能),则应避免使用 pdf-lib。