WPF应用中jsreport页码索引不更新问题求助
解决jsreport ChromePdf页码不更新问题
问题现状
在WPF C#应用中使用jsreport生成PDF报告时,所有页面的页脚均显示“Page 1 of 4”,页码索引未随页面变化,但报告内容与页眉页脚的样式均可正常显示。
问题原因
当前采用PdfOperationType.Merge方式合并页眉页脚模板,这种方式会将页眉页脚模板独立渲染为PDF后,再叠加到主文档的每一页上。此时页眉页脚模板中的$pdf.pages仅对应自身的页面集合(实际只有1页),导致循环中的@index始终为0,最终所有页码都显示为1。
解决方案
改用ChromePdf内置的页眉页脚功能,无需通过合并操作实现,直接利用Chrome提供的内置页码变量即可正确生成每页的页码。
1. 修改C#渲染配置
移除PdfOperations配置,在Chrome属性中添加HeaderTemplate和FooterTemplate,直接引用页眉页脚模板:
var report = await rs.RenderAsync(new RenderRequest { Template = new Template { Content = File.ReadAllText(Path.Combine(path.LocalPath, "ReportTemplates", _report.ReportTemplate)), Engine = Engine.Handlebars, Recipe = Recipe.ChromePdf, Chrome = new Chrome() { MarginBottom = "2cm", MarginTop = "1cm", MarginLeft = "1cm", MarginRight = "1cm", // 引用页眉页脚模板 HeaderTemplate = File.ReadAllText(Path.Combine(path.LocalPath, "ReportTemplates", "Header-Footer.html")), FooterTemplate = File.ReadAllText(Path.Combine(path.LocalPath, "ReportTemplates", "Header-Footer.html")) } }, Data = _report.Content, });
2. 简化页眉页脚模板(Header-Footer.html)
去掉循环逻辑,直接使用ChromePdf内置的{{pageNumber}}和{{totalPages}}变量,无需自定义helper:
<html> <head> <meta charset="utf-8"> <style> * { box-sizing: border-box; } body { margin: 0; padding: 0; direction: rtl; margin: 15px 10px 10px 15px; } .footer { width: 100%; padding-bottom: 15px; } </style> </head> <body> <footer class="footer"> <span>Page {{pageNumber}} of {{totalPages}}</span> </footer> </body> </html>
3. 移除冗余的helper.js
由于使用了Chrome内置的页码变量,自定义的getPageNumber和getTotalPages函数不再需要,可以直接删除helper.js文件,或者保留但不再引用。
验证要点
- 确保
MarginTop和MarginBottom的设置足够容纳页眉页脚内容,避免被主内容遮挡 - 确认模板引擎仍设置为
Handlebars,以支持{{pageNumber}}等变量解析
内容的提问来源于stack exchange,提问作者Rafeeq alfaqih
相关产品推荐
相关产品推荐

