2013-05-31 3 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);.

Чтобы быть немного ленивее, так как исходная таблица имеет только один столбец, а также, вы можете создать свой outerTable с PdfPTable outerTable = new PdfPTable(table); после инициализации вашего table с ее шириной и расстояниями. Но вы должны создать его, прежде чем добавлять свой контент в свой table.

+0

Спасибо за вашу помощь. Я попробую это решение –

0

Я пробовал решение Йоханнеса, но это не сработало, я не знаю почему. В любом случае, я нашел собственное решение. Я тестировал его с некоторыми случайными сценариями, и он работал. Решение, которое я нашел, - это поставить код ниже, прежде чем добавлять таблицу в документ с помощью 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

Просмотреть мое полное решение [здесь] (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. Разве это не то, чего вы ожидали достичь?

Смежные вопросы