Как разместить HTML в ячейке таблицы при создании нового PDF с помощью iText7? - PullRequest
3 голосов
/ 11 июня 2019

Я создаю PDF с большой таблицей на нем.В этой таблице есть ячейка, которую можно заполнить HTML.Если это так, HTML должен интерпретироваться как HTML и не показываться как обычный текст.Однако, когда я это делаю, макет / стиль скремблируется, а некоторые картинки не отображаются.(В примере, который я привел, пунктирные черты заменяются на 9).

Я программирую на C # и использую iText7 для создания PDF.

В моем проекте у меня есть следующий HTMLКод, который я хочу показать.Причина, по которой HTML-код выглядит следующим образом, заключается в том, что его RTF-файл преобразован в HTML:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="SautinSoft.RtfToHtml.dll">
<title>Untitled document</title>
<style type="text/css">
.st1{font-family:Arial;font-size:12pt;color:#000000;}
.list-marker1 li:before {
    content: "\F02D\9";
width: 30px;
font-family: Symbol;
font-size: 11pt;
}

.st2{font-family:Calibri;font-size:11pt;color:#000000;}
</style>
</head>
<body>
<div>
<p style="margin:0pt 0pt 0pt 0pt;"><span class="st1">&nbsp;</span></p>
<ul style="list-style-type:none; list-style-image:none; list-style-    position:outside; margin-left:0px; padding-left:0px; text-indent:0px; margin-top:0px; margin-bottom:0px;" class="list-marker1">
<li value="1" style="margin-left:36pt;text-indent:-18pt;"><span class="st2">Dishwasher soap container consumption is adjusted</span></li></ul>
<ul style="list-style-type:none; list-style-image:none; list-style-position:outside; margin-left:0px; padding-left:0px; text-indent:0px; margin-top:0px; margin-bottom:0px;" class="list-marker1">
<li value="2" style="margin-left:36pt;text-indent:-18pt;"><span class="st2">Power UP ballast water treatmant unit, adjusted what necessary. GPS signal error still pending</span></li></ul>
<ul style="list-style-type:none; list-style-image:none; list-style-position:outside; margin-left:0px; padding-left:0px; text-indent:0px; margin-top:0px; margin-bottom:0px;" class="list-marker1">
<li value="3" style="margin-left:36pt;text-indent:-18pt;"><span class="st2">Installed new insect killer in galley</span></li></ul>
<ul style="list-style-type:none; list-style-image:none; list-style-position:outside; margin-left:0px; padding-left:0px; text-indent:0px; margin-top:0px; margin-bottom:0px;" class="list-marker1">
<li value="4" style="margin-left:36pt;text-indent:-18pt;"><span class="st2">Adjust securing and highest ladder position after its tilted to low trunnion position</span></li></ul>
<ul style="list-style-type:none; list-style-image:none; list-style-position:outside; margin-left:0px; padding-left:0px; text-indent:0px; margin-top:0px; margin-bottom:0px;" class="list-marker1">
<li value="5" style="margin-left:36pt;text-indent:-18pt;"><span class="st2">SW spooling device test is done and no isses </span></li></ul>
<ul style="list-style-type:none; list-style-image:none; list-style-position:outside; margin-left:0px; padding-left:0px; text-indent:0px; margin-top:0px; margin-bottom:0px;" class="list-marker1">
<li value="6" style="margin-left:36pt;text-indent:-18pt;"><span class="st2">Sewage unit dosage pump; make permanent installation + drawing update</span></li></ul>
<ul style="list-style-type:none; list-style-image:none; list-style-position:outside; margin-left:0px; padding-left:0px; text-indent:0px; margin-top:0px; margin-bottom:0px;" class="list-marker1">
<li value="7" style="margin-left:36pt;text-indent:-18pt;"><span class="st2">Intervention on DN203: installed tracker box on ICT request</span></li></ul>
<ul style="list-style-type:none; list-style-image:none; list-style-position:outside; margin-left:0px; padding-left:0px; text-indent:0px; margin-top:0px; margin-bottom:0px;" class="list-marker1">
<li value="8" style="margin-left:36pt;text-indent:-18pt;"><span class="st2">Installed tracker box on ICT request </span></li></ul>
<ul style="list-style-type:none; list-style-image:none; list-style-position:outside; margin-left:0px; padding-left:0px; text-indent:0px; margin-top:0px; margin-bottom:0px;" class="list-marker1">
<li value="9" style="margin-left:36pt;text-indent:-18pt;"><span class="st2">Regular greasing emotors according ship specific grease list</span></li></ul>
<ul style="list-style-type:none; list-style-image:none; list-style-position:outside; margin-left:0px; padding-left:0px; text-indent:0px; margin-top:0px; margin-bottom:0px;" class="list-marker1">
<li value="10" style="margin-left:36pt;text-indent:-18pt;"><span class="st2">Regular maintenance of portable tools</span></li></ul>
<ul style="list-style-type:none; list-style-image:none; list-style-position:outside; margin-left:0px; padding-left:0px; text-indent:0px; margin-top:0px; margin-bottom:0px;" class="list-marker1">
<li value="11" style="margin-left:36pt;text-indent:-18pt;"><span class="st2">Intervention on DN203 due to problem with SB M/E</span></li></ul>
<p style="margin:0pt 0pt 0pt 0pt;"><span class="st2">&nbsp;</span></p>
<p style="margin:0pt 0pt 0pt 0pt;"><span class="st1">&nbsp;</span></p>
</div>
</body>
</html>

Когда я сохраняю этот файл в виде HTML-файла и открываю его в браузере, вы получаете следующий результат (это правильно): Правильный результат (веб-сайт)

Однако, когда я добавляю его в ячейку PDF, я получаю следующий результат: Плохой результат (PDF)

Как видите, черточки, используемые для маркировки, превратились в 9.

Код, который я использую для добавления HTML-кода в файл PDF, следующий:

private void AddCellToTable(table table, string HTMLContent) {
    Cell newCell = new Cell();

    foreach (var element in HtmlConverter.ConvertToElements(HTMLContent))
    {
        var test = (IBlockElement)element;
        newCell.Add(test);
    }

    table.AddCell(newCell);
 }

Этот код похож на код, предложенный https://itextpdf.com/en/resources/books/itext-7-converting-html-pdf-pdfhtml/chapter-1-hello-html-pdf (они используют java вместо C #).

Я хотел бы показывать маркеры как тире, а не эти 9.Любая помощь или предложения будут очень признательны.

Заранее спасибо.

1 Ответ

2 голосов
/ 11 июня 2019

Во-первых, проблема не связана с компоновкой (обработка таблицы / ячейки / и т. Д.) - она ​​касается только шрифтов и того, как iText обрабатывает их.

Во-вторых, проблема заключается в том, что стандартный шрифт PDF для символов Symbol, которыйиспользуется iText, отличается от используемого в браузерах.

В-третьих, iText неправильно обрабатывает "\F02D\9" (и, в частности, "\ 9").

Что вы можете сделатьсделать, чтобы улучшить результирующий PDF?Не используйте стандартный шрифт Symbol для PDF - используйте вместо него собственный шрифт Symbol.

Как это сделать?

Позвольте мне представить вам класс FontProvider.

FontProvider отвечает за обработку шрифтов, которые могут использоваться при обработке html-файла.Его экземпляр может быть передан как параметр ConverterProperties, в противном случае он будет создан iText.По умолчанию iText добавляет к FontProvider все стандартные шрифты pdf (FontProvider#addStandardPdfFonts) и некоторые бесплатные шрифты sans (DefaultFontProvider#SHIPPED_FONT_NAMES).

Вы хотите использовать свой собственный шрифт Symbol: это означает, что выдолжно препятствовать тому, чтобы iText рассматривал стандартный шрифт Символа во время преобразованияДля этого создайте DefaultFontProvider экземпляр с первым аргументом конструктора, переданным как false.(!) В 99% случаев вы хотите, чтобы некоторые другие стандартные шрифты учитывались при конвертации.Поэтому, пожалуйста, добавьте их вручную следующим образом:

provider.addFont(StandardFonts.TIMES_ROMAN);
// some other fonts to be added

Теперь добавьте свой собственный Symbol шрифт к этому FontProvider экземпляру так же, как я делал это для вышеприведенного Times:

provider.addFont("C:\\Windows\\Fonts\\symbol.ttf", PdfEncodings.IDENTITY_H);

Важно использовать IDENTITY_H там, потому что в шрифте Symbol "-" в качестве значения Unicode указано "F02D".

После всех этих изменений мне удалось получить следующий файл: enter image description here

Теперь возникает вторая проблема: iText по умолчанию неправильно обрабатывает «\ 9».Что касается этого, я не знаю ни одного прямого решения.Возможно, лучше удалить его из html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...