如何在Node.js的html-pdf中记录生成PDF的页码?
如何在html-pdf中收集页码到Node.js变量
首先得明确:html-pdf依赖PhantomJS在后台渲染PDF,{{page}}是模板变量,会在PhantomJS渲染阶段被替换成实际页码——前端HTML里的普通JS拿不到这个值,因为渲染过程和你的Node.js代码是隔离的。要把页码收集到变量里,得通过PhantomJS和Node.js之间的回调机制来传递数据。
下面是具体的实现方案:
步骤1:调整HTML结构,配置页脚回调脚本
我们需要把页脚的定义移到html-pdf的配置选项中,嵌入一段脚本,让PhantomJS渲染每一页时,把当前页码发送回Node.js端:
// 你的核心HTML内容 const htmlContent = ` <div id="pageHeader" style="text-align: center; padding-top: 30px;"></div> <body class='page'> ${myHtmlText} </body> `;
步骤2:设置PDF生成配置,收集页码
在生成PDF的配置里,我们定义页脚内容,并通过PhantomJS的onCallback函数接收每一页的页码,存入目标数组:
const pdf = require('html-pdf'); // 用来存储页码的数组 let myIndex = []; const pdfOptions = { footer: { height: '20mm', // 给页脚预留足够空间,避免脚本被截断 content: ` <div style="text-align: center; font-size: 12px;"> <span id="currentPage">{{page}}</span> <script> // 提取当前页码并发送给Node.js端 const pageNum = parseInt(document.getElementById('currentPage').textContent); window.callPhantom({ type: 'pageNumber', value: pageNum }); </script> </div> ` }, phantom: { // 接收PhantomJS传递的页码数据 onCallback: function(data) { if (data.type === 'pageNumber') { myIndex.push(data.value); } } } }; // 生成PDF并处理结果 pdf.create(htmlContent, pdfOptions).toFile('./output.pdf', (err, res) => { if (err) { console.error('PDF生成失败:', err); return; } console.log('PDF生成完成!页码数组:', myIndex); // 此时myIndex就是[1,2,3,...]这样的完整页码集合 });
替代方案:直接生成页码范围数组
如果你不需要逐页捕获页码,只是想要从1到总页数的连续数组,可以通过PhantomJS获取总页数后直接生成:
const pdfOptions = { phantom: { onLoadFinished: function() { // 获取PDF总页数 const totalPages = this.pages.length; // 生成从1到总页数的数组 myIndex = Array.from({ length: totalPages }, (_, i) => i + 1); } } };
注意事项
html-pdf库已经多年未维护(最后更新在2018年),如果项目允许,建议迁移到更现代的工具比如Puppeteer(基于Chrome),它的API更灵活,文档也更完善。- 务必确保页脚的
height设置足够,否则脚本可能被截断,无法触发回调传递页码。
内容的提问来源于stack exchange,提问作者T.J. Webaholic
相关产品推荐
相关产品推荐

