Как встроить шрифт в PDF, созданный из HTML, с помощью iText и Flying Saucer? - PullRequest
13 голосов
/ 23 сентября 2011

У меня проблема с встраиванием польских шрифтов в PDF, преобразованный из HTML.

Мой HTML-код имеет стиль в теле:

<BODY style="font-family: Tahoma, Arial, sans-serif;font-size : 8pt;">

Я попробовал 2 способа преобразования такого HTML в PDF:

  • FOP с htmlcleaner
  • iText с летающей тарелкой

Для FOP я могу добавить все используемые шрифты в его файл конфигурации, а затем в созданный PDF-файл будут встроены эти шрифты (если шрифт используется в HTML). В результате PDF у меня есть шрифт Tahoma в кодировке Identity-H. Выглядит хорошо - все польские буквы отображаются как положено.

Тогда я попробовал такое преобразование с помощью iText: кажется проще, потому что мне не нужно создавать преобразование для каждого HTML. К сожалению, я не знаю, как встроить использованные шрифты в итоговый PDF. В большинстве примеров я нашел создание PDF с нуля, и я не знаю, как применить эти методы к Flying Saucer ITextRenderer или другому объекту, используемому при преобразовании.

Мой текущий код пытается добавить шрифты в PDFCreationListener.preOpen(), получая ITextFontResolver и добавляя шрифт fs.addFont(path, true);. Но у всех .pdf, которые я создаю, нет нужных мне шрифтов.

Вторая проблема заключается в том, что в результате PDF не содержит польских букв. Это проблема в Летающей тарелке или в iText? Acrobat показывает, что созданный документ PDF использует Helvetica с кодировкой Ansi и ArialMT в качестве шрифта. Я думаю, что эта кодировка Анси не очень хорошая. Как установить польскую кодировку (Identity-H)?

Ответы [ 3 ]

12 голосов
/ 05 октября 2011

Вы можете попробовать правила css -fs-pdf-font-embed и -fs-pdf-font-encoding.

Из Руководства пользователя :

-fs-pdf-font-embed: использовать со значением, встроенным в правило font-face чтобы Flying Saucer встраивал файл шрифта в документ PDF, избегая необходимости вызывать метод addFont () объекта FontResolver класс

-fs-pdf-font-encoding: использовать внутри правила font-face, чтобы указать добавление собственного шрифта, который вы встраиваете в PDF; принимает название кодировки в качестве значения.

Например, в вашей распечатке css:

@font-face {
    font-family: DejaVu Serif;
    src: url(fonts/DejaVuSerif.ttf);
    -fs-pdf-font-embed: embed;
    -fs-pdf-font-encoding: Identity-H;
}
1 голос
/ 17 октября 2011

Моя ошибка заключалась в использовании FontResolver.addFont() в PDFCreationListener.preOpen(). Я переместил его как раз перед renderer.layout();, и теперь оно работает!

0 голосов
/ 17 октября 2018

Рабочий пример:

Файлы в корневом каталоге проекта:

  • Calibri.ttf
  • input.html

Код:

File inputFile = new File("input.html");
File outputFile = new File("example.pdf");

ITextRenderer renderer = new ITextRenderer();

String url = inputFile.toURI().toURL().toString();
FileOutputStream fileOutputStream = new FileOutputStream(outputFile);

renderer.setDocument(url);
renderer.getFontResolver().addFont("Calibri.ttf", BaseFont.IDENTITY_H, true);
renderer.layout();
renderer.createPDF(fileOutputStream);

fileOutputStream.close();       

HTML:

<style type="text/css">
    body {
        font-family: Calibri, sans-serif;
    }
</style>

Удивительно @font-face CSS не требуется

...