2013-05-31 113 views
0

我有一組具有動態行的表。有些情況下表格在頁面之間分割。在某些情況下,只有最後一行被分成下一頁。假設如果一個表有10行,則第1到9行顯示在第1頁中,第10行顯示在第2頁中。iText - 如何找到最後一行被拆分成下一頁

我正在尋找一個解決方案來分頁(document.newpage())恰巧在整個表格中將整個表格移動到下一頁。我嘗試了下面的代碼,它適用於某些場景,但不是全部。我想知道表最後一行何時會分裂,因此我可以添加分頁符將整個表移動到下一頁以避免最後一行孤行。

public class SplitItextLastRow { 

final static private String BODY_FONT = FontFactory.getFont("Arial").getFamilyname(); 

public static void main(String[] args) { 
    try { 
     Document document = new Document(); 
     document.setPageSize(PageSize.LETTER); 
     document.setMargins(16, 14, 14, 14); 
     PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C:/SplitItext.pdf")); 
     document.open(); 
     document.setPageSize(PageSize.LETTER); 
     document.setMargins(16, 14, 14, 14); 

     int[] maxCountRows = new int[] { 3, 9, 2, 3, 7, 9, 2, 4, 5, 4, 9, 7, 6, 5, 4, 6, 8, 3 }; 

     for (int k = 1; k <= maxCountRows.length; k++) { 

      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); 
      addHeader(table, "Header Row continued " + k, BaseColor.LIGHT_GRAY); 
      addHeader(table, "Header Row normal " + k, BaseColor.LIGHT_GRAY); 

      for (int i = 1; i < maxCountRows[k - 1]; i++) { 
       StringBuilder sb = new StringBuilder(); 
       for (int p = 0; p < maxCountRows[k - 1] * 6; p++) { 
        sb.append("Text Row "); 
       } 
       add(table, sb.toString() + i, BaseColor.WHITE); 
      } 

      float verticalPosition = writer.getVerticalPosition(true); 
      System.out.println("------Table " + k); 
      if ((verticalPosition - table.getTotalHeight()) <= document.bottom()) { 
       System.out.println("........................................Last Row splitted"); 
      } 

      document.add(table); 
     } 

     document.close(); 
    } catch (Exception de) { 
     de.printStackTrace(); 
    } 

} 

private static void addHeader(PdfPTable table, String text, BaseColor color) { 
    PdfPCell pdfCellHeader = new PdfPCell(); 
    pdfCellHeader.setBackgroundColor(color); 
    pdfCellHeader.addElement(new Paragraph(new Phrase(text, FontFactory.getFont(BODY_FONT, 8f, BaseColor.BLUE)))); 
    table.addCell(pdfCellHeader); 
} 

private static void add(PdfPTable table, String text, BaseColor color) { 
    PdfPCell pdfCellHeader = new PdfPCell(); 
    pdfCellHeader.setBackgroundColor(color); 
    pdfCellHeader.addElement(new Paragraph(new Phrase(text, FontFactory.getFont(BODY_FONT, 5f, BaseColor.GREEN)))); 
    table.addCell(pdfCellHeader); 
} 

}

+0

您是否嘗試將完整的表格添加到具有單列和單行的另一個表格中?這應該給你你想要的結果... – Samoth

回答

1

呀,它的工作原理如下:

在你的循環for (int k = 1; ...的開頭必須添加:

PdfPTable outerTable = new PdfPTable(1); 
outerTable.setSpacingAfter(0); 
outerTable.setSpacingBefore(0); 
outerTable.setTotalWidth(document.right() - document.left()); 
outerTable.setLockedWidth(true); 

,並在它的結束,更換document.add(table);附:

outerTable.addCell(new PdfPCell(table)); 
document.add(outerTable); 

這就是它:-)
然後,您應該刪除您的調試輸出,並且您可以刪除「繼續」標題和其相應的table.setSkipFirstHeader(true);。這就足夠了,你有table.setHeaderRows(1);

由於您的原始表格只有一列,因此您可以使用寬度和間距初始化table後創建outerTablePdfPTable outerTable = new PdfPTable(table);。但是在將內容添加到您的table之前,您必須創建它。

+0

感謝您的幫助。我會嘗試這個解決方案 –

0

我試過Johannes的解決方案,但它沒有工作,我不知道爲什麼。無論如何,我找到了自己的解決方案。我用一些隨機場景對它進行了測試,結果很奏效。我找到的解決方案是在將表添加到document.add(table)的文檔之前的代碼。

int headerRowsCount = table.getHeaderRows(); 
float headerRowsHeight = 0f; 
for (int j = 0; j < headerRowsCount; j++) { 
    headerRowsHeight += table.getRowHeight(j); 
} 
float totalTableHeight = table.getTotalHeight() - headerRowsHeight; 
float lastRowHeight = table.getRowHeight(table.getRows().size() - 1); 
float tableHeightExceptLastRow = totalTableHeight - lastRowHeight + document.bottom(); 
float tableGap = verticalPosition - tableHeightExceptLastRow; 
boolean lastRowSplit = (tableGap > -35 && (tableGap < lastRowHeight) && tableHeightExceptLastRow > 0); 
if (lastRowSplit) { 
    document.newPage(); 
} 
+0

查看我的完整解決方案[here](http://stackoverflow.com/a/17207793/959484)... – Samoth

0

下面是完整的工作示例,如解釋here ...我使用了iText 2.1.7。

import java.awt.Color; 
import java.io.FileOutputStream; 

import com.lowagie.text.Document; 
import com.lowagie.text.FontFactory; 
import com.lowagie.text.PageSize; 
import com.lowagie.text.Paragraph; 
import com.lowagie.text.Phrase; 
import com.lowagie.text.pdf.PdfPCell; 
import com.lowagie.text.pdf.PdfPTable; 
import com.lowagie.text.pdf.PdfWriter; 

public class SplitItextLastRow 
{ 
    final static private String BODY_FONT = FontFactory.getFont("Arial").getFamilyname(); 

    public static void main(final String[] args) 
    { 
     try 
     { 
      Document document = new Document(); 
      document.setPageSize(PageSize.LETTER); 
      document.setMargins(16, 14, 14, 14); 
      PdfWriter writer = 
        PdfWriter.getInstance(document, new FileOutputStream("SplitItext.pdf")); 
      document.open(); 
      document.setPageSize(PageSize.LETTER); 
      document.setMargins(16, 14, 14, 14); 

      int[] maxCountRows = new int[] 
      { 
        3, 9, 2, 3, 7, 9, 2, 4, 5, 4, 9, 7, 6, 5, 4, 6, 8, 3 
      }; 

      for (int k = 1; k <= maxCountRows.length; k++) 
      { 
       PdfPTable table = new PdfPTable(1); 
       table.setSpacingAfter(0); 
       table.setSpacingBefore(0); 
       table.setTotalWidth(document.right() - document.left()); 
       table.setLockedWidth(true); 

       PdfPTable outerTable = new PdfPTable(table); 

       table.setHeaderRows(1); 
       table.setSkipFirstHeader(true); 
       addHeader(table, "Header Row continued " + k, Color.LIGHT_GRAY); 
       addHeader(table, "Header Row normal " + k, Color.LIGHT_GRAY); 

       for (int i = 1; i < maxCountRows[k - 1]; i++) 
       { 
        StringBuilder sb = new StringBuilder(); 
        for (int p = 0; p < (maxCountRows[k - 1] * 6); p++) 
        { 
         sb.append("Text Row "); 
        } 
        add(table, sb.toString() + i, Color.WHITE); 
       } 

       float verticalPosition = writer.getVerticalPosition(true); 
       System.out.println("------Table " + k); 
       if ((verticalPosition - table.getTotalHeight()) <= document.bottom()) 
       { 
        System.out.println("........................................Last Row splitted"); 
       } 

       outerTable.addCell(new PdfPCell(table)); 
       document.add(outerTable); 
      } 

      document.close(); 
     } 
     catch (Exception de) 
     { 
      de.printStackTrace(); 
     } 
    } 

    private static void addHeader(final PdfPTable table, final String text, final Color color) 
    { 
     PdfPCell pdfCellHeader = new PdfPCell(); 
     pdfCellHeader.setBackgroundColor(color); 
     pdfCellHeader.addElement(new Paragraph(new Phrase(text, FontFactory.getFont(BODY_FONT, 8f, 
       Color.BLUE)))); 
     table.addCell(pdfCellHeader); 
    } 

    private static void add(final PdfPTable table, final String text, final Color color) 
    { 
     PdfPCell pdfCellHeader = new PdfPCell(); 
     pdfCellHeader.setBackgroundColor(color); 
     pdfCellHeader.addElement(new Paragraph(new Phrase(text, FontFactory.getFont(BODY_FONT, 5f, 
       Color.GREEN)))); 
     table.addCell(pdfCellHeader); 
    } 
} 

而它產生的輸出是here。這不是你期望實現的嗎?

相關問題