3 Stimmen

iTextSharp HTML zu PDF unter Beibehaltung der Leerzeichen

Ich verwende die FreeTextBox.dll, um Benutzereingaben zu erhalten, und speichere diese Informationen im HTML-Format in der Datenbank. Ein Beispiel für die Benutzereingabe ist die folgende:

                                                                     133 Peachtree St NE
                                                                     Atlanta,  GA 30303
                                                                     404-652-7777

                                                                     Cindy Cooley
                                                                     www.somecompany.com
                                                                     Product Stewardship Mgr

                                                                    9/9/2011
Deidre's Company
123 Test St
Atlanta, GA 30303

Test test.

Ich möchte, dass der HTMLWorker die Leerzeichen, die der Benutzer eingibt, beibehält, aber er entfernt sie. Gibt es eine Möglichkeit, die Leerzeichen des Benutzers zu erhalten? Im Folgenden finden Sie ein Beispiel dafür, wie ich mein PDF-Dokument erstelle.

Public Shared Sub CreatePreviewPDF(ByVal vsHTML As String, ByVal vsFileName As String)

        Dim output As New MemoryStream()
        Dim oDocument As New Document(PageSize.LETTER)
        Dim writer As PdfWriter = PdfWriter.GetInstance(oDocument, output)
        Dim oFont As New Font(Font.FontFamily.TIMES_ROMAN, 8, Font.NORMAL, BaseColor.BLACK)

        Using output
            Using writer
                Using oDocument
                    oDocument.Open()
                    Using sr As New StringReader(vsHTML)
                        Using worker As New html.simpleparser.HTMLWorker(oDocument)

                            worker.StartDocument()
                            worker.SetInsidePRE(True)
                            worker.Parse(sr)
                            worker.EndDocument()
                            worker.Close()
                            oDocument.Close()

                        End Using
                    End Using

                    HttpContext.Current.Response.ContentType = "application/pdf"
                    HttpContext.Current.Response.AddHeader("Content-Disposition", String.Format("attachment;filename={0}.pdf", vsFileName))
                    HttpContext.Current.Response.BinaryWrite(output.ToArray())
                    HttpContext.Current.Response.End()

                End Using
            End Using
            output.Close()
        End Using

    End Sub

1voto

Chris Haas Punkte 50077

Es gibt einen Fehler in iText und iTextSharp, den Sie aber leicht beheben können, wenn es Ihnen nichts ausmacht, den Quellcode herunterzuladen und ihn neu zu kompilieren. Sie müssen eine Änderung an zwei Dateien vornehmen. Alle Änderungen, die ich vorgenommen habe, sind inline im Code kommentiert. Die Zeilennummern basieren auf dem 5.1.2.0 Code Rev. 240

Die erste ist in iTextSharp.text.html.HtmlUtilities.cs . Suchen Sie die Funktion EliminateWhiteSpace in Zeile 249 und ändern Sie sie in:

    public static String EliminateWhiteSpace(String content) {
        // multiple spaces are reduced to one,
        // newlines are treated as spaces,
        // tabs, carriage returns are ignored.
        StringBuilder buf = new StringBuilder();
        int len = content.Length;
        char character;
        bool newline = false;
        bool space = false;//Detect whether we have written at least one space already
        for (int i = 0; i < len; i++) {
            switch (character = content[i]) {
            case ' ':
                if (!newline && !space) {//If we are not at a new line AND ALSO did not just append a space
                    buf.Append(character);
                    space = true;  //flag that we just wrote a space
                }
                break;
            case '\n':
                if (i > 0) {
                    newline = true;
                    buf.Append(' ');
                }
                break;
            case '\r':
                break;
            case '\t':
                break;
            default:
                newline = false;
                space = false;  //reset flag
                buf.Append(character);
                break;
            }
        }
        return buf.ToString();
    }

Die zweite Änderung betrifft die iTextSharp.text.xml.simpleparser.SimpleXMLParser.cs . In der Funktion Go in Zeile 185 Zeile 248 ändern in:

if (html /*&& nowhite*/) {//removed the nowhite check from here because that should be handled by the HTML parser later, not the XML parser

1voto

user973754 Punkte 81

Vielen Dank für die Hilfe. Ich war in der Lage, eine kleine Lösung zu finden, indem ich folgendes tat:

vsHTML.Replace("  ", "&nbsp;&nbsp;").Replace(Chr(9), "&nbsp;&nbsp;&nbsp;&nbsp;").Replace(Chr(160), "&nbsp;").Replace(vbCrLf, "<br />")

Der eigentliche Code wird nicht richtig angezeigt, aber die erste Ersetzung ersetzt die Leerzeichen durch &nbsp; , Chr(9) mit 5 &nbsp; und Chr(160) con &nbsp; .

0voto

jle Punkte 9028

Ich würde die Verwendung von wkhtmltopdf anstelle von iText. wkhtmltopdf gibt das HTML exakt so aus, wie es von Webkit (Google Chrome, Safari) gerendert wird, anstatt die Konvertierung von iText. Es ist nur eine Binärdatei, die Sie aufrufen können. Abgesehen davon würde ich die HTML-Datei überprüfen, um sicherzustellen, dass es Absätze und/oder Zeilenumbrüche in der Benutzereingabe gibt. Diese könnten vor der Konvertierung herausgenommen werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X