Node.js 中实现 PDF 文档生成的技术

PDF 文档是一种常见的电子文档格式,它具有跨平台、可读性好、结构化等优点,因此在很多场合下都被广泛应用。在前端领域中,我们有时需要通过代码生成 PDF 文档,例如在网站上提供打印功能、生成报告等。本文将介绍如何使用 Node.js 实现 PDF 文档生成的技术。

选择 PDF 生成库

在 Node.js 中,有很多 PDF 生成库可供选择,例如 jsPDF、pdfkit、puppeteer 等。这些库各有特点,我们需要选择适合自己需求的库。下面分别介绍三个库的特点和使用方法。

jsPDF

jsPDF 是一个轻量级的 JavaScript 库,可以在浏览器和 Node.js 中使用。它提供了一组 API,可以用于创建 PDF 文档、添加文本、图片、表格等元素。jsPDF 的优点是使用简单、轻量级,适合处理简单的 PDF 文档。

const jsPDF = require('jspdf');
const doc = new jsPDF();

doc.text('Hello, world!', 10, 10);
doc.save('hello.pdf');

上面的代码使用 jsPDF 创建了一个 PDF 文档,添加了一个文本元素,并保存为 hello.pdf 文件。

pdfkit

pdfkit 是一个基于 Node.js 的 PDF 生成库,它提供了一组 API,可以用于创建 PDF 文档、添加文本、图片、表格等元素。pdfkit 的优点是功能强大、支持多种字体、布局灵活,适合处理复杂的 PDF 文档。

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

const doc = new PDFDocument();
doc.pipe(fs.createWriteStream('output.pdf'));

doc.fontSize(25).text('Hello, world!', 100, 100);

doc.end();

上面的代码使用 pdfkit 创建了一个 PDF 文档,添加了一个文本元素,并保存为 output.pdf 文件。

puppeteer

puppeteer 是一个基于 Chrome 的 Node.js 库,可以用于控制 Chrome 浏览器进行自动化测试、爬虫等任务。它也可以用于生成 PDF 文档,它的优点是可以使用 Chrome 的渲染引擎,支持 CSS、JavaScript 等特性,生成的 PDF 文档质量高。

const puppeteer = require('puppeteer');

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

  await page.goto('https://www.baidu.com');
  await page.pdf({ path: 'baidu.pdf' });

  await browser.close();
})();

上面的代码使用 puppeteer 打开百度网站,生成 PDF 文档,并保存为 baidu.pdf 文件。

选择合适的工具链

在使用 PDF 生成库时,我们通常需要使用一些辅助工具,例如模板引擎、数据源等。下面介绍一些常用的工具链。

EJS + jsPDF

EJS 是一款简单、高效的 JavaScript 模板引擎,它可以将数据和模板文件合并生成 HTML 文本。我们可以将生成的 HTML 文本作为 jsPDF 的输入,生成 PDF 文档。

const jsPDF = require('jspdf');
const ejs = require('ejs');

const template = `
  <html>
    <head>
      <title><%= title %></title>
    </head>
    <body>
      <h1><%= content %></h1>
    </body>
  </html>
`;

const data = {
  title: 'Hello, world!',
  content: 'This is a PDF document generated with jsPDF and EJS.'
};

ejs.render(template, data, (err, html) => {
  const doc = new jsPDF();
  doc.fromHTML(html);
  doc.save('hello.pdf');
});

上面的代码使用 EJS 生成 HTML 文本,然后使用 jsPDF 将 HTML 转换为 PDF 文档,并保存为 hello.pdf 文件。

Handlebars + pdfkit

Handlebars 是一款高效、易用的 JavaScript 模板引擎,它可以将数据和模板文件合并生成 HTML 文本。我们可以将生成的 HTML 文本作为 pdfkit 的输入,生成 PDF 文档。

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

const template = `
  <html>
    <head>
      <title>{{title}}</title>
    </head>
    <body>
      <h1>{{content}}</h1>
    </body>
  </html>
`;

const data = {
  title: 'Hello, world!',
  content: 'This is a PDF document generated with pdfkit and Handlebars.'
};

const html = Handlebars.compile(template)(data);

const doc = new PDFDocument();
doc.pipe(fs.createWriteStream('output.pdf'));

doc.fontSize(25).text(html, 100, 100);

doc.end();

上面的代码使用 Handlebars 生成 HTML 文本,然后使用 pdfkit 将 HTML 转换为 PDF 文档,并保存为 output.pdf 文件。

Database + puppeteer

如果我们需要从数据库中读取数据生成 PDF 文档,可以使用 puppeteer 和数据库驱动程序结合使用。下面以 MySQL 数据库为例,介绍如何使用 puppeteer 生成 PDF 文档。

const puppeteer = require('puppeteer');
const mysql = require('mysql');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'mydb'
});

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

  await page.goto('http://localhost:3000/myreport');

  connection.query('SELECT * FROM mytable', (err, results) => {
    const data = results.map(row => ({
      id: row.id,
      name: row.name,
      age: row.age
    }));

    page.evaluate(data => {
      const table = document.createElement('table');
      const rows = data.map(row => `
        <tr>
          <td>${row.id}</td>
          <td>${row.name}</td>
          <td>${row.age}</td>
        </tr>
      `).join('');

      table.innerHTML = `
        <thead>
          <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Age</th>
          </tr>
        </thead>
        <tbody>
          ${rows}
        </tbody>
      `;

      document.body.appendChild(table);
    }, data);

    page.pdf({ path: 'myreport.pdf' });
  });

  await browser.close();
})();

上面的代码使用 puppeteer 打开报告页面,从数据库中读取数据,生成 HTML 表格,然后生成 PDF 文档,并保存为 myreport.pdf 文件。

总结

本文介绍了在 Node.js 中实现 PDF 文档生成的技术。我们可以选择不同的 PDF 生成库,根据需求选择合适的工具链,使用模板引擎、数据库驱动程序等辅助工具,生成各种形式的 PDF 文档。PDF 文档生成是前端开发中重要的一环,希望本文能够对读者有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6588f081eb4cecbf2de1ac21


纠错
反馈