PrimeFaces 6.1 DataExporter导出PDF时不包含footer问题求助
针对你遇到的PrimeFaces 6.1导出PDF页脚失败,以及PrimeFaces Extensions导出带多余HTML的问题,我整理了两个针对性的解决方案:
方案一:修复原生PrimeFaces PDF导出的页脚缺失问题
PrimeFaces 6.1的默认PDF导出器确实没有处理footerText或facet:footer的逻辑,我们可以通过自定义导出器来补全这个功能:
- 先创建一个自定义的PDF导出器类,继承原生的
PDFExporter并重写导出逻辑:
import org.primefaces.component.export.PDFExporter; import org.primefaces.component.datatable.DataTable; import com.lowagie.text.Document; import com.lowagie.text.pdf.PdfPTable; import com.lowagie.text.pdf.PdfWriter; public class CustomPDFExporter extends PDFExporter { @Override protected void exportTable(DataTable table, Document document, PdfWriter writer) throws Exception { // 先执行原生导出逻辑,生成表格主体 super.exportTable(table, document, writer); // 构建页脚表格 PdfPTable footerTable = new PdfPTable(table.getColumns().size()); footerTable.setWidthPercentage(100); // 遍历每一列,提取页脚内容 table.getColumns().forEach(column -> { String footerContent = null; // 优先获取footerText if (column.getFooterText() != null) { footerContent = column.getFooterText(); } // 再处理facet定义的footer else if (column.getFacet("footer") != null) { footerContent = column.getFacet("footer").toString(); } // 将内容添加到页脚表格,空内容则填空白单元格 footerTable.addCell(footerContent != null ? footerContent : ""); }); // 将页脚表格添加到文档中 document.add(footerTable); } }
- 在页面中使用这个自定义导出器:
<p:commandButton value="导出PDF" ajax="false"> <p:dataExporter type="pdf" target="yourDataTableId" exporter="#{yourBean.customPDFExporter}" fileName="yourReportName"/> </p:commandButton>
注意:要在你的Bean中实例化CustomPDFExporter并暴露为可访问的属性
方案二:清理PrimeFaces Extensions导出器中的HTML内容
如果更倾向于用PrimeFaces Extensions的导出器,可以通过自定义ExportColumnCallback来过滤掉列中的HTML标签:
- 在你的Bean中定义一个回调方法,用于清理HTML:
import org.primefaces.extensions.component.export.ExportColumnCallback; import org.primefaces.extensions.component.export.ExporterOptions; public ExportColumnCallback htmlCleanupCallback = new ExportColumnCallback() { @Override public String exportColumn(Object value, String columnId, ExporterOptions options) { if (value == null) { return ""; } // 使用正则表达式移除所有HTML标签 String cleanValue = value.toString().replaceAll("<[^>]*>", ""); return cleanValue; } };
如果只想清理特定列,可以在方法中判断columnId,比如只处理ID为formulaColumn的列
- 在页面中配置导出器使用这个回调:
<pe:exporter type="pdf" target="yourDataTableId" fileName="yourReportName" columnCallback="#{yourBean.htmlCleanupCallback}"/>
额外注意事项
- 自定义原生导出器时,要确保项目中包含了PrimeFaces 6.1依赖的iText 2.x版本,避免版本冲突
- PrimeFaces Extensions的版本要和PrimeFaces 6.1匹配(推荐使用Extensions 6.1.x系列)
内容的提问来源于stack exchange,提问作者Alexandra
相关产品推荐
相关产品推荐

