2013-05-18 5 views
9

Pracuję nad itext 5 przy użyciu java. Mam strony z wieloma tabelami z dynamicznymi wierszami. W niektórych przypadkach ostatni wiersz tabeli jest podzielony na następną stronę z następującym nagłówkiem. Używam setHeaderRows() i setSkipFirstHeader() do zarządzania kontynuacją następnej strony. Ostatni wiersz ma wystarczająco dużo miejsca, aby zmieścić się na wcześniejszej stronie. Chciałbym dopasować ten ostatni wiersz na tej samej stronie zamiast na następnej stronie.iText - unikaj ostatniego wiersza, aby nie ciąć tabel na stronie podzielonej na następną stronę

Na przykład na stronie 1 ostatni wiersz jest podzielony na pierwszy wiersz następnej strony. Zamiast tego chciałbym dopasować ten wiersz na stronie 1, więc zapisz jedną dodatkową stronę ze wszystkimi pustymi miejscami.

Próbowałem użyć setExtendLastRow(), ale nie działa. Czy ktoś wie, jak naprawić ten problem. Załączam działający kod przykładowy.

public class ProposalItextSplitLastRow { 
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:/SplitLastRow.pdf")); 
     document.open(); 
     document.setPageSize(PageSize.LETTER); 
     document.setMargins(16, 14, 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, BaseColor.LIGHT_GRAY, row++); 

      add(table, "Text Row 1 ", BaseColor.WHITE, row++); 
      add(table, "Text Row 2 ", BaseColor.WHITE, row++); 
      add(table, "Text Row 3 ", BaseColor.WHITE, 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); 
} 
} 

Odpowiedz

6

Musiałem wykonać przykład, aby zrozumieć twoje pytanie. Myliłeś mnie mówiąc o nagłówku, który nie jest nagłówkiem (wiersze z "Wierszem nagłówka normalnym" nie są wierszami nagłówka!) I twoje odniesienie do setExtendLastRow() też nie pomogło (wspominając, że ta metoda nie ma sensu, aby ja, to bardzo mylące).

To powiedziawszy, rozwiązanie twojego problemu jest nie myślenia. Mam przepisany główne klasy:

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("SplitLastRow.pdf")); 
     document.open(); 
     document.setPageSize(PageSize.LETTER); 
     document.setMargins(16, 14, 42, 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, "Header Row continued " + m, BaseColor.LIGHT_GRAY, row++); 
      add(table, "Header Row normal " + m, BaseColor.LIGHT_GRAY, row++); 

      add(table, "Text Row 1 ", BaseColor.WHITE, row++); 
      add(table, "Text Row 2 ", BaseColor.WHITE, row++); 
      add(table, "Text Row 3 ", BaseColor.WHITE, 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(); 
    } 
} 

upewnij się zdefiniować szerokość całkowitą zamiast szerokość procent i blokadę szerokość. Jak udokumentowano (i zgodnie z informacją zdrowy rozsądek), obiekt PdfPTable nie zna swojej faktycznej szerokości, jeśli zdefiniujesz procent szerokości. Jest rzeczą oczywistą, że nie można obliczyć wysokości tabeli, która nie zna faktycznej szerokości.

Następnie użyj metody getVerticalPosition(), aby uzyskać aktualną pozycję kursora i sprawdź, czy pierwsze dwa wiersze pasują do strony. Jeśli przed dodaniem tabeli nie przejdą do nowej strony. Jeśli chcesz sprawdzić, czy kompletna tabela pasuje, użyj metody getTotalHeight() zamiast metody getRowHeight().

+1

Udało się idealnie :) Dziękuję bardzo. Twoja pomoc jest bardzo doceniana. Przepraszam za pomylenie z moim pytaniem. Walczyłem o to z ostatnich kilku tygodni. Rozwiązało to mój problem polegający na unikaniu pierwszego wiersza do wycinania tabel na stronie podzielonej na http://stackoverflow.com/questions/16548001/itext-avoid-first-row-to-cut-tables-on-page-split. Tylko ciekawostki, aby wiedzieć, dlaczego twoje rozwiązanie nie działa z table.setWidthPercentage(). –

+1

Możesz mieć pomysł, jak rozwiązać mój drugi problem, aby nie podzielić ostatniego wiersza na następną stronę (nie wdychać osieroconego ostatniego wiersza). Tak właśnie dzieje się z moim kodem. wiersz nagłówka normalny 16 Row Tekst 1 Row Tekst 2 ----- przerwa strona ---- wiersz nagłówka kontynuowano 16 Row Tekst 3 szukam rozwiązania nie mają podziału strony (split) i drukować wiersz 3 w pierwszej stronie, jak wiersz nagłówka normalny 16 Row Tekst 1 Row Tekst 2 Tekst Row 3 –

+0

Dlaczego miałbym odpowiedzieć na kolejne pytanie, które jest zamieszczone na odpowiedź, która nie jest akceptowane ? Ponadto: dodatkowe pytania wymagają nowego pytania. –

-1

Można zrobić

table.setSplitRows(false); 

Ale wierzę, że gdy nie jest wiersz, który przyzwyczajenie pasuje to po prostu przyzwyczajenie być pokazane. Warto jednak zrobić zdjęcie

+0

Ta sprawa nie będzie działać, aby przechowywać wszystkie razem na jednej stronie. –

8

można table.setKeepRowsTogather(true);

table.setHeaderRows(1) również wynajęliśmy go

setKeepRowsTogather() sprawdza, czy może on zachować wszystkie wiersze na stronie, ale dzieli wiersze w przypadku tabela obejmuje wiele stron. W takim przypadku setHeaderRows(1) ponownie umieści wiersze nagłówka na następnej stronie.

+2

setKeepRowsTogather pracował dla mnie – wutzebaer

+0

Dzięki za pomoc! To zadziałało dla mnie table.setKeepRowsTogather (true) ;, ale w mojej wersji iText (5.5.5) ta funkcja nie istnieje: właściwie jest to odpowiednik to table.setKeepTogether (true); – russellhoff

Powiązane problemy