dynamiczne tabelei itextSharp

0

Witam

Mam spory problem a czas mnie bardzo nagli. Tworze za pomocą biblioteki iTextSharp dynamicznie dynamicznie tabele (liczba wierszy zależy od liczby danych wprowadzonych przez użytkownika) i napotkałem problem następujący problem:

Gdy tabela posiada taką liczbę wierszy, że nie mieszczą się na jednej stronie to chciałbym wtedy przed wierszem na nowej stronie dodać nagłówek tabeli. Dodam jeszcze że każda strona ma stopkę więc chciałbym sprawdzić czy dany wiersz mieści się na stronie (przed stopką) jeśli nie to wtedy przenieść ten wiersz na nową stronę dodając nagłówek tabeli. Proszę o jakieś wskazówki może wystarczy sprawdzić pozycję obecnie wstawianego wiersza i gdy np nie mieści się na stronie to przenieść go na następną stronę ale nie mam pojęcia jak to zrobić i czy w ogóle w dobrym kierunku idę.

0
Document doc = new Document(iTextSharp.text.PageSize.LETTER, 25, 25, 25, 25); //tworzymy nowy dokument, określamy typ i marginesy

PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream(test.pdf,FileMode.Create)); //deklarujemy writer zapisujący dokument w pliku 

doc.Open(); //otwieramy dokument

doc.NewPage(); //tworzymy pierwszą stronę w dokumencie (następne jeśli będą potrzebne tworzą się automatycznie)

Rectangle pageSize = doc.PageSize; //deklarujemy obszar, który będziemy wypełniać w dokumencie

PdfPTable tableTest = new PdfPTable(3); //tworzymy tabelę z trzema kolumnami
					
tableTest.SetWidthPercentage(new float[] {30, 30, 30}, pageSize); //deklarujemy procentowo szerokość każdej z kolumn
					
tableTest.HeaderRows = 1; // <---ważne ...określasz jeden (pierwszy) wiersz tabeli jako nagłówek - przepisywany będzie na początku każdej strony jako pierwszy wiersz

tableTest.WidthPercentage = 100F; //ustawiamy szerokość tabeli - procentowo

PdfPCell komorka1 = new PdfPCell(new iTextSharp.text.Paragraph("Kolumna1Nazwa", font)); //tworzymy komórkę i dodajemy ją do tabeli
tableTest.AddCell(komorka1);
							
PdfPCell komorka2 = new PdfPCell(new iTextSharp.text.Paragraph("Kolumna2Nazwa", font)); //tworzymy komórkę i dodajemy ją do tabeli
tableTest.AddCell(komorka2);
							
PdfPCell komorka3 = new PdfPCell(new iTextSharp.text.Paragraph("Kolumna3Nazwa", font)); //tworzymy komórkę i dodajemy ją do tabeli
tableTest.AddCell(komorka3);

dla takiej tabeli tworzysz pętlę, która będzie wypełniała kolejne rekordy(wiersze) w tabeli i wypełniamy na takiej samej zasadzie jak wyżej...

//np. foreach dla wszystkich elementów z listy, dataset itd.
{
PdfPCell komorka1 = new PdfPCell(new iTextSharp.text.Paragraph(TUTAJ DANE KTÓRE MA WSTAWIĆ W POSTACI STRING, font));
tableTest.AddCell(komorka1);
						
PdfPCell komorka2 = new PdfPCell(new iTextSharp.text.Paragraph(TUTAJ DANE KTÓRE MA WSTAWIĆ W POSTACI STRING, font));
tableTest.AddCell(komorka2);
							
PdfPCell komorka3 = new PdfPCell(new iTextSharp.text.Paragraph(TUTAJ DANE KTÓRE MA WSTAWIĆ W POSTACI STRING, font));
tableLab.AddCell(komorka3);
							
doc.Add(tableTest);
doc.Close();
}

(kod przerabiany w locie, nie kompilowany, także mógł się jakiś błąd wkraść, ale ogólna idea tworzenia prostej dynamicznej tabeli w iTextSharp utrzymana)

...zadeklarować musisz jeszcze font przed jego wykorzystaniem.
Tak zbudowana tabela będzie przerzucała wiersz na następną stronę trzymając się ustalonego marginesu, kontynuacja tabeli będzie rozpoczynać się wierszem z nazwami kolumn, a chyba o to Ci chodziło.

Ja tak buduje dynamiczne tabele przy użyciu iTextSharp 4.0.2

0

...co do Footer`a jeszcze...

jeśli dodasz go na takiej zasadzie (koniecznie przed doc.Open(), jeśli ma się wyświetlać od pierwszej strony):

HeaderFooter footer = new HeaderFooter(new Phrase("TEST FOOTER"), false);
doc.Footer = footer;

to tabela do niego się dostosuje

1 użytkowników online, w tym zalogowanych: 0, gości: 1