iText7实现表格按商品强制分页:C#发票生成问题
iText7 发票表格保持商品行连续及手动分页方案
保持同一商品行连续不拆分
核心思路是将单个商品的所有行(标题+各版本)封装为嵌套表格,并开启整体不拆分属性,让iText确保整个商品的内容不会被分页截断。
代码示例
// 创建主表格,1列占满页面宽度 Table mainInvoiceTable = new Table(UnitValue.createPercentArray(1)).useAllAvailableWidth(); // 处理商品A:封装为嵌套表格 Table productGroupTable = new Table(UnitValue.createPercentArray(1)).useAllAvailableWidth(); // 商品标题行 productGroupTable.addCell(new Cell().add(new Paragraph("商品A(总计8件)"))); // 版本行 productGroupTable.addCell(new Cell().add(new Paragraph("- 版本1(3件)"))); productGroupTable.addCell(new Cell().add(new Paragraph("- 版本2(5件)"))); // 关键:设置嵌套表格整体不允许拆分 productGroupTable.setKeepTogether(true); // 将嵌套表格添加到主表格(去掉边框避免样式冲突) mainInvoiceTable.addCell(new Cell().add(productGroupTable).setBorder(Border.NO_BORDER)); // 同理处理商品B Table productBGroup = new Table(UnitValue.createPercentArray(1)).useAllAvailableWidth(); productBGroup.addCell(new Cell().add(new Paragraph("商品B(总计3件)"))); productBGroup.addCell(new Cell().add(new Paragraph("- 版本2(3件)"))); productBGroup.setKeepTogether(true); mainInvoiceTable.addCell(new Cell().add(productBGroup).setBorder(Border.NO_BORDER)); // 将主表格添加到文档 document.add(mainInvoiceTable);
手动插入分页符
要在表格中间手动分页,需在需要分页的位置,向主表格添加一个包含AreaBreak的无边框单元格,确保分页后后续内容从新页面开始。
代码示例(在商品B前插入分页)
// 在商品B的嵌套表格之前,添加分页单元格 Cell pageBreakCell = new Cell() .add(new AreaBreak(AreaBreakType.NEXT_PAGE)) .setBorder(Border.NO_BORDER); mainInvoiceTable.addCell(pageBreakCell); // 再添加商品B的嵌套表格...
之前尝试无效的原因说明
- 直接添加
AreaBreak到文档:若表格未完成渲染,iText会先渲染完当前表格内容,再处理AreaBreak,导致分页符跑到文档末尾,生成空白页。 - 嵌套表格未生效:未设置
setKeepTogether(true)属性,iText仍会将嵌套表格的行独立拆分,达不到整体保持的效果。
内容的提问来源于stack exchange,提问作者ChMar
相关产品推荐
相关产品推荐

