You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:48:00