WkhtmlToPdf несколько шрифтов лица / стили

Я прочитал много, много тем о хлопотах с несколькими стилями шрифтов / гранями при использовании wkhtmltopdf.

В настоящее время у нас возникают проблемы при использовании Nunito (предоставляемых веб-шрифтами Google) в обычном и жирном стиле на одной странице. Мы перепробовали много (возможных) решений, но ни одно из них еще не дало нам решения.

Мы попробовали следующие решения, но пока никому не удалось:

  • Изменить имя семейства шрифтов с помощью FontForge
  • Конвертировать шрифты используя fontsquirrel
  • Вручную конвертировать шрифты в base64, используя openssl (mac)
  • Преобразовать в base64 http://www.opinionatedgeek.com/dotnet/tools/base64encode/default.aspx
  • Использование удаленных включений для шрифтов (из Google WebFont)
  • Измените шрифты на SVG

Все вышеперечисленные методы не сработали. Браузер отображает его правильно, но wkhtmltopdf, похоже, отображает его по-другому.

Мы опубликовали несколько тестовых примеров на: http://bannes.nl/fonts

Если у кого-нибудь есть предложение, как это исправить, пожалуйста, дайте мне знать. Если вы используете Mac и установили wkhtmltopdf, пожалуйста, не стесняйтесь проверять случаи на http://bannes.nl/fonts. Я включил вывод PDF для каждого теста в их каталоге.

Надеюсь, что кто-то получил предложение о том, как это исправить!

С наилучшими пожеланиями,

Робин

4 ответа

Я потратил много часов на эту же проблему, пытаясь заставить несколько лиц Готэма работать вместе, и смог решить проблему. Я обнаружил, что многие шрифты TTF/OTF, являющиеся частью коллекции, содержат поле "Предпочитаемое семейство" в таблице имен TTF. Значением этого поля будет общее имя коллекции, например "Gotham" во всех файлах шрифтов. Таким образом, фактическое "Фамилия" может быть уникальным, например, "Gotham Book" или "Gotham Light", но "Preferred Family" будет распространено среди всех файлов.

FontForge TTF Names

Если вы проверите установленный шрифт с помощью команды fc-list в Linux, вы увидите, что для шрифта есть два семейных имени:

Две фамилии

В этом и заключается проблема. Когда несколько лиц в одном и том же семействе используются в одном и том же PDF, wkhtmltopdf (не уверен, что это вещь веб-набора или вещь QT), кажется, выбирает только один из шрифтов в "Предпочитаемом семействе" и использует его для рендеринга всех текст, который должен отображаться разными шрифтами в этой группе.

К счастью, вы можете полностью удалить поле "Preferred Family" из файлов шрифтов, используя такой инструмент, как FontForge. Я сделал это для всех нужных мне вариантов семейства Готэм и переустановил их, что решило проблему двойной фамилии:

Одна фамилия

Это позволило wkhtmltopdf правильно отобразить все поверхности шрифтов в моей системе.

  • Используйте эту похожую утилиту, поддерживаемую другими разработчиками: https://github.com/plessl/wkpdf
  • если это не работает для вас, убедитесь, что у вас установлена ​​последняя версия wkhtmltopdf

Если вышеперечисленное не работает вообще, вы можете попробовать другую утилиту командной строки или надежное решение, например: "LaTeX": https://www.latex-project.org/

Почему бы не изменить lib?

Я использовал wkhtmltopdf, но нашел внутренний мир с TCPDF

Я напечатал HTML-страницу, делая это

// set font
$pdf->SetFont('itclegacysansltmedium', '', 12);
// add a page
$pdf->AddPage();

// set some text to print
ob_start();
include('view.php');
$html = ob_get_clean();
$pdf->writeHTML($html, true, false, true, false, '');

Я приехал сюда в поисках «коллизий шрифтов wkhtmltopdf».

FontForge мне не подойдет. Вместо этого я установил инструмент командной строки ttx (через brew install fonttools в OS X).

Потом:

  • ttx /path/to/font.otf, это выводит
  • Открыть /path/to/font.ttx с помощью текстового редактора
  • Установите уникальное значение для элементов имени, которые содержат общее имя шрифта. например
            # original:
    <namerecord nameID="1" platformID="1"...>Arial</namerecord>
    # updated: 
    <namerecord nameID="1" platformID="1"...>Arial Bold</namerecord>
    
  • Сохраните файл
  • ttx /path/to/font.ttx, это выводит
  • Использовать /path/to/font#1.otf на месте /path/to/font.otf
Другие вопросы по тегам