我正在使用
java的itext 5.我有一些带有动态行的多个表的页面.在某些情况下,最后一行的表格将分为下一页和下一个标题.我正在使用setHeaderRows()和setSkipFirstHeader()来管理下一页的继续.最后一行有足够的空间来适应早期页面.我想在同一页面的最后一行,而不是下一页.
例如,在第1页,最后一行被拆分成下一页的第一行.相反,我想在第1页适合该行,所以保存一个额外的页面与所有的空白.
我尝试使用setExtendLastRow(),但它不工作.有谁知道如何解决这个问题.我附加了一个工作示例代码.
public class ProposalItextSplitLastRow { public static void main(String[] args) { try { Document document = new Document(); document.setPageSize(PageSize.LETTER); document.setMargins(16,14,14); PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream("C:/SplitLastRow.pdf")); document.open(); document.setPageSize(PageSize.LETTER); document.setMargins(16,42,38); for (int m = 1; m < 20; m++) { int row = 0; PdfPTable table = new PdfPTable(1); table.setSpacingAfter(0); table.setSpacingBefore(0); table.setWidthPercentage(100); table.setHeaderRows(1); table.setSkipFirstHeader(true); add(table,"Header Row continued " + m,BaseColor.LIGHT_GRAY,row++); add(table,"Header Row normal " + m,row++); add(table,"Text Row 1 ",BaseColor.WHITE,"Text Row 2 ","Text Row 3 ",row++); addPadding(table); document.add(table); } document.close(); } catch (Exception de) { de.printStackTrace(); } } private static void add(PdfPTable table,String text,BaseColor color,int row) { PdfPCell pdfCellHeader = new PdfPCell(); pdfCellHeader.setBackgroundColor(color); pdfCellHeader.addElement(new Paragraph(new Phrase(text))); table.addCell(pdfCellHeader); } private static void addPadding(PdfPTable table) { PdfPCell cell = new PdfPCell(); cell.setFixedHeight(2f); cell.setBorder(Rectangle.NO_BORDER); cell.setColspan(table.getNumberOfColumns()); table.addCell(cell); } }
解决方法
我必须执行这个例子来了解你的问题.通过谈论一个不是标题的标题(“标题行正常”的行不是标题行!),并且您对setExtendLastRow()的引用也没有帮助(提到该方法不会)感觉到我,这很混乱).
这就是说,解决你的问题是没有脑子的.我重写了主类:
public static void main(String[] args) { try { Document document = new Document(); document.setPageSize(PageSize.LETTER); document.setMargins(16,new FileOutputStream("SplitLastRow.pdf")); document.open(); document.setPageSize(PageSize.LETTER); document.setMargins(16,38); for (int m = 1; m < 20; m++) { int row = 0; PdfPTable table = new PdfPTable(1); table.setSpacingAfter(0); table.setSpacingBefore(0); table.setTotalWidth(document.right() - document.left()); table.setLockedWidth(true); table.setHeaderRows(1); table.setSkipFirstHeader(true); add(table,row++); addPadding(table); if (writer.getVerticalPosition(true) - table.getRowHeight(0) - table.getRowHeight(1) < document.bottom()) { document.newPage(); } document.add(table); } document.close(); } catch (Exception de) { de.printStackTrace(); } }
确保您定义总宽度而不是宽度百分比,并锁定宽度.如已记录(和常识告诉您),如果定义宽度百分比,PdfPTable对象不知道其实际宽度.不用说,您无法计算不知道它的实际宽度的表的高度.
然后使用getVerticalPosition()方法获取光标的当前位置,并检查前两行是否适合页面.如果在添加表之前不去新页面.如果要检查整个表是否适合,请使用getTotalHeight()方法,而不是getRowHeight()方法.