2016-07-20 3 views
0

Ich habe iTextSharp verwendet, um eine PDF-Datei zu generieren.Keine anderen Tabellen nach dem PDF-Größenlimit zu sehen

Ich habe 6 PdfPTable s erstellt, aber es zeigt nur 3.

// Create new PDF document 
Document document = new Document(PageSize.A4, 20f, 20f, 20f, 20f); 
try { 
    PdfWriter writer = PdfWriter.GetInstance(document, 
     new FileStream(filename, FileMode.Create)); 

    document.Open(); 
    int spacing = 0; 

    for (int i = 0; i <= 6; i++) { 

     PdfPTable table = new PdfPTable(2); 

     table.TotalWidth = 144f; 
     table.LockedWidth = false; 
     PdfPCell cell = new PdfPCell(new Phrase("This is table" + i)); 
     cell.Colspan = 3; 
     cell.HorizontalAlignment = 1; 
     table.AddCell(cell); 

     table.WriteSelectedRows(0, -1, 
      document.Left + spacing, document.Top, 
      writer.DirectContent); 

     spacing = spacing + 200; 
    } 
} 

catch (Exception ex) {} 

finally { 
    document.Close(); 
    ShowPdf(filename); 
} 

Hier habe ich für 6 mal gesetzt haben die for-Schleife, aber es zeigt nur 3 Tabelle.

screenshot

Wie kann ich zeigen alle 6 Tische? Ich möchte nur 3 Tabellen in 1 Zeile nach dieser Pause auf neue Zeile zeigen und andere 3 Tabellen anzeigen.

+0

antwortete ich unten aber ich, dass Sie auch darauf hinweisen wollte, sind Schleife während 'i <= 6' was bedeutet, dass Sie tatsächlich 7 Tische haben, nicht 6. –

+0

Ja. Entschuldigung, mein Fehler. Es sind eigentlich 7 Tische. – deepak

Antwort

2

Ich denke, der Titel Ihrer Frage fasst das Problem ziemlich genau zusammen.

Wenn Sie WriteSelectedRows verwenden, liegt es in Ihrer Verantwortung, die X- und Y-Speicherorte anzugeben, an die Sie schreiben und die Sie außerhalb der Seitengrenzen zeichnen. A4 hat 595 horizontale Einheiten und es gibt einfach nicht genug Platz. Das ist 100% gültig, aber die meisten Leute werden es nicht sehen. Ich vermute, dass Sie Ihren Tisch in die nächste Zeile "wickeln" wollen. Es gibt ein paar Möglichkeiten zu tun, dass:

Bigger Seitengröße

Wechseln Sie zu so etwas wie PageSize.A0 und Sie sollten mehr Platz haben. Die Seitengröße ist nur ein Hinweis, die Drucksoftware wird jedoch nach Bedarf skaliert.

MOD Check-in-Schleife

Dies ist etwas komplizierter eine, sondern alle n Tabellen setzen Sie die x an den linken Rand koordinieren und Ihre y durch die höchste von der vorherigen Reihe von Tabellen erhöhen.

int spacing = 0; 
//The current Y position 
float curY = document.Top; 

//Well ask iText how tall each table was and set the tallest to this variable 
float lineHeight = 0; 

//Maximum number of tables that go on a line 
const int maxPerLine = 3; 

for (int i = 0; i <= 6; i++) { 

    PdfPTable table = new PdfPTable(2); 

    table.TotalWidth = 144f; 
    table.LockedWidth = false; 
    PdfPCell cell = new PdfPCell(new Phrase("This is table" + i)); 
    cell.Colspan = 3; 
    cell.HorizontalAlignment = 1; 
    table.AddCell(cell); 

    table.WriteSelectedRows(0, -1, 
     document.Left + spacing, curY, 
     writer.DirectContent); 

    spacing = spacing + 200; 

    //Set the height to whichever is taller, the last table or this table 
    lineHeight = Math.Max(lineHeight, table.TotalHeight); 

    //If we're at the "last" spot in the "row" 
    if (0 == (i + 1) % maxPerLine) { 
     //Offset our Y by the tallest table 
     curY -= lineHeight; 

     //Reset "row level" variables 
     spacing = 0; 
     lineHeight = 0; 
    } 
} 

Wrapper Tabelle

Dies ist, was ich wirklich empfehlen. Wenn Sie Tabellen "wickeln" wollen, dann benutzen Sie einfach eine äußere Tabelle, um Ihre inneren Tabellen zu halten, und Sie bekommen alles umsonst und Sie müssen sich nicht mit DirectContent anlegen (obwohl Sie wahrscheinlich Tabellengrenzen ändern wollen).

var outerTable = new PdfPTable(3); 
outerTable.DefaultCell.Border = PdfPCell.NO_BORDER; 

for (int i = 0; i <= 6; i++) { 

    PdfPTable innerTable = new PdfPTable(2); 

    innerTable.TotalWidth = 144f; 
    innerTable.LockedWidth = false; 
    PdfPCell cell = new PdfPCell(new Phrase("This is table" + i)); 
    cell.Colspan = 3; 
    cell.HorizontalAlignment = 1; 
    innerTable.AddCell(cell); 

    outerTable.AddCell(innerTable); 

} 

document.Add(outerTable); 
+0

Perfekte Erklärung. In Ihrem zweiten Ansatz (Wrapper-Tabelle): Es zeigt nur 6 Tabellen wegen 'var outerTable = new PdfPTable (3);' aber insgesamt ist 7 Tabelle. Nun, wenn ich die Bedingung in "i <= 8" ändern, dann zeigt es die 9 Tabellen. Also, ich denke, unser 2. Ansatz kann in einigen Situationen wie 7 Tabellen etc. falsch gehen. – deepak

+0

iText füllt nicht automatisch die Lücken für Sie aus, aber Sie können [CompleteRow() '] aufrufen (http://stackoverflow.com/a/17302895/231316) Wenn Sie fertig sind, wird es mit leeren Zellen gefüllt. –

+0

Danke. Deine Erklärung ist sehr perfekt. – deepak

Verwandte Themen