使用 JavaScript (Node.js) 生成 PDF 报告:库概览与代码示例

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

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

开始课程

使用 JavaScript (Node.js) 生成 PDF 报告:完整指南



创建 PDF 文档是 Web 开发中最常见的任务之一。无论是导出账单、生成分析报告还是创建证书,都离不开一个可靠的工具。在 Node.js 生态系统中,有几个强大的库可以快速灵活地解决这个问题。在本文中,我们将介绍三种主要方法,并向您展示如何为您的 PythonLib 项目选择合适的工具。



为什么要在服务器端生成 PDF?

客户端生成(浏览器)通常有限制:用户可能在刷新页面时丢失数据,而移动设备并不总能正确处理复杂的布局。基于 Node.js 的服务器端方法让您可以完全控制文档结构,保护商业逻辑,并允许将生成集成到 CI/CD 流水线中。



Node.js 中处理 PDF 的三大库



1. PDFKit — 底层内容操作

PDFKit 是从零开始创建 PDF 最流行的库。它不需要安装额外的依赖项(如 Chromium),并允许您控制文档的每个像素。

  • 优点: 轻量级(仅几兆字节),完全自由的布局,支持字体、图像和矢量图形。
  • 缺点: 对于复杂的布局需要编写大量代码,没有自动文本换行。

创建简单发票的示例:

const PDFDocument = require('pdfkit');const fs = require('fs');

const doc = new PDFDocument({ margin: 50 });

doc.pipe(fs.createWriteStream('invoice.pdf'));

// 标题doc.fontSize(25).text('发票号 #123', { align: 'center' });doc.moveDown();

// 表格doc.fontSize(12).text('商品:咨询', { continued: true }) .text('价格:5000 卢布', { align: 'right' });

doc.moveDown();doc.text('总计:5000 卢布', { align: 'right' });

doc.end();


2. Puppeteer — 从 HTML/CSS 生成

Puppeteer 启动一个无头 Chromium 浏览器并将 HTML 页面转换为 PDF。如果您已经有带 CSS 样式的 HTML 模板,这是理想的选择。

  • 优点: 通过 HTML 实现简单布局,支持所有 CSS 属性(flex、grid、@media print),能够添加页眉和页脚。
  • 缺点: 依赖项较重(约 300 MB Chromium),启动速度慢,不适合简单的文档。

将 HTML 转换为 PDF 的示例:

const puppeteer = require('puppeteer');

async function generateReport() { const browser = await puppeteer.launch(); const page = await browser.newPage();

await page.setContent(`<h1 style="color: blue;">2025 年 3 月报告</h1> <p>总收入:<strong>1,200,000 卢布</strong></p>`);

await page.pdf({ path: 'report.pdf', format: 'A4', printBackground: true, margin: { top: '20px', bottom: '20px' } });

await browser.close();}

generateReport();


3. jsPDF — 通用工具(客户端 + 服务器)

jsPDF 是一个既可以在浏览器中也可以在 Node.js 中运行的库。它提供了用于创建表格、图表甚至嵌入字体的高级方法。

  • 优点: API 简单,内置表格支持(通过插件),体积小。
  • 缺点: 在服务器上需要手动配置字体(默认情况下不包含所有西里尔字符)。

带表格的示例:

const { jsPDF } = require("jspdf");require("jspdf-autotable");

const doc = new jsPDF();

doc.text("销售统计", 14, 20);

doc.autoTable({ head: [['月份', '销售额', '利润']], body: [ ['一月', '100', '20,000'],

推荐