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