2016-08-19 1 views
1

Ich erzeuge ein PDF-Dokument mit iTextSharp Version 5.5.7, indem ich ihren "streaming" -Modus benutze - womit ich meine, dass ich nicht den Ort jedes einzelnen Textes festlege, ich füge dem Dokument nur Absätze hinzu lassen Sie iTextSharp herausfinden, wo Sie sie zeichnen. Der Text, den ich ausgib, ist das Ergebnis eines Berichtsgenerators, daher ist es jedes Mal anders.iText (Sharp) - Wie vermeide ich das Erstellen einer leeren Seite?

Das Problem, auf das ich stoße, ist dies: Stellen Sie sich vor, dass ich angesichts der Seitengröße und der ausgewählten Schriftart 40 Zeilen Text auf einer Seite anpassen kann. Ich gebe 40 Absätze aus, dann gebe ich einen leeren Absatz (contents = "") aus, dann ein Bild, das eine ganze Seite ausfüllt. iTextSharp macht genau das, was ich ihm sage - ich habe am Ende eine Seite voller Text, eine leere Seite und dann eine Seite mit meinem Bild.

Aber jetzt sieht mein Dokument komisch aus - da ist diese unerwartet leere Seite in der Mitte von allem.

Ich kann nicht einfach sagen, "keine Leerzeilen ausgeben", weil natürlich eine Leerzeile nach nur 20 Textzeilen angezeigt wird, in diesem Fall muss es da sein. Ich brauche eine Möglichkeit, iTextSharp zu sagen: "Schließe diesen Absatz nur ein, wenn es nicht das Einzige auf einer Seite ist" oder erkenne irgendwie, dass die Seite in OnEndPage() leer ist und unterdrücke die Ausgabe (ohne meine Seitenzahlen zu verschrauben).

Irgendwelche Vorschläge, wie ich das machen kann?

SPÄTER

Die Ausgabe aus dem Reportgenerator ADDED:

<html> 
<p>Information header</p> 
<p>Detail</p> 
<p>Detail</p> 
<p>Detail</p> 
<p></p> <!-- Blank line inserted by report generator for clarity --> 
<p>Information header</p> 
<p>Detail</p> 
<p>Detail</p> 
<p>Detail</p> 
... 
<p>Detail</p> <!-- just by random happenstance this is the last line that will fit on the first page --> 
<p></p> <!-- This line happens to be blank, I have no control over it --> 
<img src="blah blah"></image> 

My (Pseudo-) Code:

foreach (HtmlNode node in htmlFromReportGenerator) 
{ 
    if (node is text) 
     pdfDoc.Add(new Paragraph(node.text)); 
    else if (node is image) 
     pdfDoc.Add(new Image(node.image)); 
} 
+0

Warum verwenden Sie ein schmutziger Trick, um eine leere Seite einzufügen? Schmutzige Tricks haben schmutzige Nebenwirkungen. Unter http://StackOverflow.com/a/11185274/1622493 finden Sie Informationen zum Hinzufügen einer leeren Seite. Sie sollten keine andere Antwort von den Benutzern von Stack Overflow erwarten, da Sie keinen Code bereitgestellt haben, mit dem wir Ihr Problem reproduzieren können. –

+0

Ich habe Ihre Frage (es ist in einer sehr verwirrten Art und Weise formuliert) neu gelesen und vielleicht wollen Sie keine leere Seite zwischen den 40 Absätzen und dem Bild hinzufügen. Vielleicht verwenden Sie den schmutzigen Trick, einen leeren Absatz hinzuzufügen, weil Sie etwas Abstand zwischen dem Text und dem Bild einführen möchten. In jedem Fall ist eine Frage mit so viel Text und ohne Beispielcode keine gute Stack Overflow-Frage. –

+0

Wie auch immer: iText ignoriert 'document.newPage()' wenn eine Seite leer ist. Sie müssen eine besondere Anstrengung unternehmen, wenn Sie eine leere Seite einführen möchten. Die Aussage * da ist diese unerwartet leere Seite in der Mitte von allem * ist nicht klar. Sie sollten sich wirklich etwas mehr Mühe geben, das Problem zu erklären. –

Antwort

1

Nach Brunos Vorschlag, meine (Pseudo-) Code sieht nun wie folgt aus:

Paragraph lastParagraph = null; 
foreach (HtmlNode node in htmlFromReportGenerator) 
{ 
    if (node is text) 
    { 
     Paragraph parg = new Paragraph(node.text); 
     if ((lastParagraph != null) && (text.Trim().Length == 0)) 
     lastParagraph.SpacingAfter += parg.Leading; 
     else 
     { 
     pdfDoc.Add(parg); 
     lastParagraph = parg; 
     } 
    } 
    else if (node is image) 
    { 
     pdfDoc.Add(new Image(node.image)); 
     lastParagraph = null; 
    } 
} 
Verwandte Themen