iTextSharp HTML в PDF сохраняя пробелы - PullRequest
2 голосов
/ 01 октября 2011

Я использую FreeTextBox.dll для получения пользовательского ввода и храню эту информацию в формате HTML в базе данных. Пример ввода пользователя ниже:

<p>                                                                     133 Peachtree St NE<br />                                                                     Atlanta,  GA 30303<br />                                                                     404-652-7777</p>    <p>                                                                     Cindy Cooley<br />                                                                     <a href="http://www.somecompany.com" rel="nofollow">www.somecompany.com</a><br />                                                                     Product Stewardship Mgr</p>    <p>                                                                    9/9/2011<br />Deidre's Company<br />123 Test St<br />Atlanta, GA 30303<br /><br />Test test.</p>    <p> </p> 

Я хочу, чтобы HTMLWorker защищал пробелы, в которые входят пользователи, но он удаляет их. Есть ли способ сохранить пустое пространство пользователя? Ниже приведен пример того, как я создаю свой документ PDF.

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

Ответы [ 3 ]

1 голос
/ 01 октября 2011

В iText и iTextSharp есть сбой, но вы можете исправить это довольно легко, если не возражаете против загрузки исходного кода и его повторной компиляции. Вам нужно внести изменения в два файла. Любые изменения, которые я сделал, комментируются в коде. Номера строк основаны на коде 5.1.2.0, версия 240

.

Первый находится в iTextSharp.text.html.HtmlUtilities.cs. Найдите в строке 249 функцию EliminateWhiteSpace и измените ее на:

    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();
    }

Второе изменение в iTextSharp.text.xml.simpleparser.SimpleXMLParser.cs. В функции Go в строке 185 измените строку 248 на:

if (html /*&& nowhite*/) {//removed the nowhite check from here because that should be handled by the HTML parser later, not the XML parser
0 голосов
/ 03 октября 2011

Спасибо за помощь всем. Я смог найти небольшую работу, выполнив следующее:

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

Фактический код не отображается должным образом, но при первой замене пробелы заменяются &nbsp;, Chr(9) на 5 &nbsp; и Chr(160) на &nbsp;.

0 голосов
/ 01 октября 2011

Я бы рекомендовал использовать wkhtmltopdf вместо iText.wkhtmltopdf будет выводить html в точности так, как это делается с помощью webkit (Google Chrome, Safari) вместо преобразования iText.Это просто двоичный файл, который вы можете вызвать.При этом я мог бы проверить HTML, чтобы убедиться, что в пользовательском вводе есть параграфы и / или разрывы строк.Они могут быть удалены перед конверсией.

...