iText7 pdfHTML多HTML转PDF 页脚Page X of Y显示异常如何解决
问题原因
你当前的实现逻辑是每个HTML模板单独转成临时PDF文件,再用PdfMerger合并。而CSS中的counter(page)和counter(pages)是单个PDF生成时计算的独立计数器,每个临时PDF的总页数都是1、当前页也是1,合并阶段不会重新渲染已经生成的页脚内容,因此最终所有页面的页码都显示为Page 1 of 1。
解决方案
推荐两种可行的实现方式,可根据业务场景选择:
方案1:合并完成后统一添加页码(兼容性最好)
首先删掉原有HTML中@page的页脚CSS配置,合并完所有页面后统一遍历绘制页脚,总页数计算不会出错,代码修改如下:
ByteArrayOutputStream outputBaos = new ByteArrayOutputStream(); PdfWriter writer = new PdfWriter(outputBaos); PdfDocument pdf = new PdfDocument(writer); PdfMerger merger = new PdfMerger(pdf); for (String template : templates) { ByteArrayOutputStream tempOutput = new ByteArrayOutputStream(); PdfWriter tempWriter = new PdfWriter(tempOutput); PdfDocument tempPdf = new PdfDocument(tempWriter); HtmlConverter.convertToPdf(template, tempPdf, converterProperties); tempPdf = new PdfDocument( new PdfReader( // 原代码笔误修正:tpByteArray改为toByteArray new ByteArrayInputStream(tempOutput.toByteArray()) ) ); merger.merge(tempPdf, 1, tempPdf.getNumberOfPages()); tempPdf.close(); } // 合并完成后统一给所有页加页脚 int totalPages = pdf.getNumberOfPages(); // 可根据需求替换为自定义字体 PdfFont font = PdfFontFactory.createFont(StandardFonts.HELVETICA); for (int i = 1; i <= totalPages; i++) { PdfPage page = pdf.getPage(i); String footerText = String.format("Page %d of %d", i, totalPages); PdfCanvas canvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), pdf); canvas.beginText() .setFontAndSize(font, 10) // 坐标可根据实际页面边距调整,当前为右下角位置 .moveText(page.getPageSize().getRight() - 80, page.getPageSize().getBottom() + 20) .showText(footerText) .endText(); canvas.release(); } pdf.close(); return outputBaos;
方案2:合并HTML后一次性转PDF
如果所有HTML模板的页面配置(边距、纸张大小等)完全一致,可以把所有HTML的有效内容拼接成一个完整的HTML字符串,再一次性调用转换接口,此时CSS的页码计数器会全局计算,就能得到正确的页码。
// 拼接所有HTML内容(如果每个模板是完整的HTML文件,需要先提取body内的内容再拼接) StringBuilder fullHtml = new StringBuilder(); for (String template : templates) { fullHtml.append(template); } ByteArrayOutputStream outputBaos = new ByteArrayOutputStream(); HtmlConverter.convertToPdf(fullHtml.toString(), outputBaos, converterProperties); return outputBaos;
内容的提问来源于stack exchange,提问作者Wee Hong KOH
相关产品推荐
相关产品推荐

