Puppeteer适合HTML转PDF因能真实渲染网页内容,支持动态加载、高保真输出;pdf-lib适合代码直接生成或修改PDF,性能更高但布局需手动计算。

要在Node.js中生成PDF,最直接有效的方式是利用现有的库。对于需要将HTML内容转换为PDF的场景,我个人通常会选择Puppeteer,它通过控制一个无头浏览器来渲染网页并将其保存为PDF,这能最大程度地保留原始网页的布局和样式。而如果你的需求是纯粹地从代码层面构建PDF,例如绘制图形、插入文本等,那么像
pdf-lib
如果你想把一个网页或一段HTML代码转换成PDF,Puppeteer无疑是目前最强大、最灵活的选项之一。它本质上是Google Chrome或Chromium的Node.js API,这意味着你可以用它来做任何浏览器能做的事情,包括生成高质量的PDF。
以下是一个基本的Puppeteer生成PDF的流程和代码示例:
安装Puppeteer:
npm install puppeteer
编写生成PDF的代码:
const puppeteer = require('puppeteer');
const path = require('path');
async function generatePdfFromHtml(htmlContent, outputPath) {
let browser;
try {
browser = await puppeteer.launch({
headless: true, // 在后台运行浏览器,不显示UI
args: ['--no-sandbox', '--disable-setuid-sandbox'] // 某些环境可能需要
});
const page = await browser.newPage();
// 设置页面内容为HTML字符串
await page.setContent(htmlContent, {
waitUntil: 'networkidle0' // 等待网络空闲,确保所有资源加载完成
});
// 或者,如果你想从一个URL生成PDF
// await page.goto('https://example.com', {
// waitUntil: 'networkidle0'
// });
await page.pdf({
path: outputPath,
format: 'A4',
printBackground: true, // 打印背景颜色和图片
margin: {
top: '20mm',
right: '20mm',
bottom: '20mm',
left: '20mm'
},
// displayHeaderFooter: true, // 是否显示页眉页脚
// headerTemplate: '<span>页眉</span>', // 页眉HTML模板
// footerTemplate: '<span>页脚</span>', // 页脚HTML模板
});
console.log(`PDF已成功生成到: ${outputPath}`);
} catch (error) {
console.error('生成PDF时出错:', error);
} finally {
if (browser) {
await browser.close();
}
}
}
// 示例用法
const html = `
<!DOCTYPE html>
<html>
<head>
<title>我的报告</title>
<style>
body { font-family: 'Arial', sans-serif; margin: 0; padding: 0; color: #333; }
.container { width: 800px; margin: 50px auto; border: 1px solid #eee; padding: 30px; box-shadow: 0 0 10px rgba(0,0,0,0.05); }
h1 { color: #0056b3; text-align: center; }
p { line-height: 1.6; }
.footer { text-align: center; margin-top: 50px; font-size: 0.8em; color: #666; }
/* 打印样式 */
@media print {
.container { box-shadow: none; border: none; }
/* 强制在某个元素前分页 */
.new-page { page-break-before: always; }
}
</style>
</head>
<body>
<div class="container">
<h1>年度总结报告</h1>
<p>这是一段关于今年工作成果的介绍性文字。我们取得了显著的进步,特别是在产品研发和市场拓展方面。</p>
<p>本报告将详细阐述各项指标、挑战以及未来的展望。</p>
<h2>关键成就</h2>
<ul>
<li>用户增长率达到20%</li>
<li>新产品发布市场反响良好</li>
<li>团队协作效率提升15%</li>
</ul>
<div class="new-page"></div> <!-- 强制分页 -->
<h2>数据分析</h2>
<p>通过对用户行为数据的深入分析,我们发现了一些新的趋势,这将指导我们下一阶段的策略调整。</p>
<img src="https://via.placeholder.com/600x200.png?text=Placeholder+Image" alt="示例图片" style="max-width: 100%; height: auto; display: block; margin: 20px 0;">
<div class="footer">
<p>版权所有 © 2023 我的公司</p>
</div>
</div>
</body>
</html>
`;
const outputPath = path.join(__dirname, 'my_report.pdf');
generatePdfFromHtml(html, outputPath);这段代码展示了如何启动一个无头浏览器实例,加载HTML内容,然后调用
page.pdf()
page.pdf()
对我来说,选择Puppeteer生成PDF,最核心的原因就是它的“所见即所得”能力。我们都知道,网页开发已经非常成熟,用HTML、CSS和JavaScript来构建复杂、美观的布局简直是家常便饭。如果一个PDF只是要把这些已经设计好的内容呈现出来,Puppeteer简直是完美的选择。
它的优势非常明显:
waitUntil: 'networkidle0'
headless: false
当然,它也有一些缺点,比如启动一个浏览器实例会有一定的资源开销,但对于大多数服务器端生成PDF的场景,这点开销是完全可以接受的。
在实际操作中,尤其面对复杂的报告或文档,样式、分页和字体处理是生成高质量PDF的关键,也常常是让人头疼的地方。
样式处理: Puppeteer能够很好地处理CSS,但你需要记住,PDF是打印介质,所以要充分利用CSS的
@media print
@media print
mm
cm
in
pt
px
page.pdf()
printBackground: true
分页控制: 这是PDF生成中最常见的挑战之一。没人喜欢内容被截断在两页之间。CSS3提供了一些非常有用的属性来控制分页:
page-break-before: always;
page-break-after: always;
page-break-inside: avoid;
div
orphans
widows
displayHeaderFooter
headerTemplate
footerTemplate
<span>
pageNumber
totalPages
字体问题: 字体是另一个可能导致PDF看起来与预期不符的问题。
@font-face
<link>
font-family: 'MyCustomFont', Arial, sans-serif;
处理这些问题时,我经常会采取迭代的方式:先生成一个初稿,然后根据PDF的实际效果调整HTML/CSS,再生成,直到满意为止。
虽然Puppeteer是我处理HTML到PDF转换的首选,但在某些特定场景下,其他Node.js库可能更合适,或者说,它们解决的是不同类型的问题。
pdf-lib
jsPDF
pdf-lib
pdf-lib
html-pdf
html-pdf
html-pdf
总的来说,选择哪个库,关键在于你的具体需求。如果你的内容已经以HTML形式存在,并且需要高保真度的视觉呈现,Puppeteer是毋庸置疑的首选。而如果你需要从零开始构建PDF内容,或者对现有PDF进行操作,那么像
pdf-lib
以上就是怎样使用Node.js生成PDF?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号