TCPDF, не удалось включить файл определения шрифта со шрифтами OpenType

Я веб-программист без глубоких знаний о шрифтах, и я изо всех сил пытаюсь заставить TCPDF включать наш собственный шрифт OpenType. Мы купили файлы шрифтов OpenType (.oft), которые не защищены никаким DRM.

Многие вопросы, касающиеся этого сообщения об ошибке, в конечном итоге получают один и тот же совет. Я установил правильные права доступа к файлам для папок, используемых TCPDF (755), и у меня нет проблем с использованием addTTFfont() для включения шрифтов .ttf TrueType, например:

$pdf->addTTFfont('/path-to-font/DejaVuSans.ttf', 'TrueTypeUnicode', '', 32);

Поэтому я составил следующий код, чтобы включить наш тип OpenFont. Документация addTTFfont() указывает на поддержку параметров OpenTypeUnicode и OpenType.

$pdf->addTTFfont('/path-to-font/customfont.otf', 'OpenTypeUnicode', '', 96);

Что приводит к:

TCPDF ERROR: Could not include font definition file:

Мы используем TCPDF v6.0.020, и я читал информационную страницу шрифтов TCPDF без удачи пока. Я заметил, что TCPDF также имеет функцию addFont() (документация здесь), которая кажется более очевидным для использования, поскольку он не содержит никаких ссылок на какой-либо тип шрифта. Однако мне не удалось заставить эту функцию работать с небольшой документацией, которая у нее есть.

Любая помощь будет принята с благодарностью.


person Seroczynski    schedule 15.10.2013    source источник
comment
OTF отличается от TTF форматом.   -  person kurdtpage    schedule 28.11.2016


Ответы (5)


Вы уверены, что получаете эту ошибку при вызове addTTFfont()? Причина, по которой я спрашиваю, заключается в том, что я проверил код TCPDF (только что выполнил глобальный поиск «Не удалось включить файл определения шрифта»), и это сообщение появляется только в методе addFont().

Эти два метода могут немного сбивать с толку, но несколько месяцев назад я написал себе несколько заметок, которые частично воспроизведу ниже в надежде, что они вам хоть как-то помогут:

  • addTTFfont() — основная функция этого метода заключается в преобразовании шрифта из TTF (или OTF) в «сырую» версию, необходимую TCPDF. То, как реализована эта функция, теоретически позволяет использовать ее в качестве основного метода добавления шрифтов в документ. Сначала он проверит папку шрифтов tcpdf, и если преобразованных файлов там нет, он продолжит и выполнит преобразование. Это немного больше накладных расходов, но все же не мой предпочтительный метод добавления шрифтов в файлы, так как вам нужно знать, какой стиль шрифта вы конвертируете, чтобы процесс работал даже успешно. IMO, лучше использовать этот метод для предварительного преобразования любых шрифтов, которые вы планируете использовать, и просто использовать addFont() для добавления «сырых» версий в документ.

  • AddFont() — добавляет в документ «сырой» (т.е. уже преобразованный) шрифт, что означает, что он доступен для написания текста.

  • SetFont() — устанавливает шрифт для следующего фрагмента текста, который вы пишете.

Поэтому я бы использовал addTTFfont() для предварительного преобразования шрифта в «сырую» версию, а затем использовал addFont() и setFont() в коде, который фактически создает PDF.

Если addFont() не работает с указанным выше сообщением об ошибке, это означает, что он не может найти файл определения шрифта. Имейте в виду, что если вы вызываете addFont() с набором стилей ('i', 'b', 'bi' и т. д.), все, что он делает, это добавляет это к имени файла (перед расширением).

Самое главное, вам нужно убедиться, что ваш вызов addTTFFont() создает «сырые» файлы шрифтов и сохраняет их в папку со шрифтами. Для каждого стиля должно быть три файла с расширениями .php, .z и .ctg.z. Итак, если вы преобразовали шрифт с именем blah.ttf, вы получите blah.php, blah.z и blah.ctg.z. Если вы преобразуете blah bold.ttf, TCPDF обнаружит, что это полужирный шрифт, и добавит «b» в конец имен файлов: blahb.php, blahb.z и blahb.ctg.z.

Надеюсь, здесь найдется какой-нибудь самородок, который поможет! Удачи!

person JamesG    schedule 16.10.2013
comment
Да, я уверен. Я пытался объяснить свою ситуацию как мог. Когда я проверяю свой сервер после ошибки, я всегда получаю один и тот же результат; один файл customfont.z, но нет файла customfont.php. Если я правильно понимаю TCPDF, описанная мной ошибка указывает на неудачное создание файла customfont.php (определения). - person Seroczynski; 16.10.2013
comment
Правильно, у вас должно получиться три файла (.php, .z и .ctg.z). Ужасно странно, что addTTFfont() создает только файл .z, а не два других. Возвращает ли функция имя шрифта (указывает на успех) или логическое значение false (указывает на ошибку)? - person JamesG; 17.10.2013
comment
Обновление: я только что попытался преобразовать файл TTF, который не понравился TCPDF, и он создал файл .z, но ни один из двух других файлов. Функция вернула ЛОЖЬ. В моем конкретном случае не удалось проверить версию snft примерно в строке 365 в tcpdf_fonts.php (у меня версия 6.0.039, но я не думаю, что этот файл сильно изменился в последнее время). Честно говоря, хотя автор проделал невероятную работу с TCPDF, аспект преобразования шрифтов был проклятием моей жизни, и поэтому я использовал альтернативные средства преобразования своих шрифтов. - person JamesG; 17.10.2013
comment
Спасибо, что внимательно изучили его, JamesG. Можете ли вы сказать мне, какие альтернативные методы вы нашли для преобразования вашего шрифта? Мы действительно хотим использовать наш шрифт в файлах PDF. - person Seroczynski; 17.10.2013
comment
Честно говоря, мне больше всего понравился этот сайт: xml-convert.com/en/convert-tff-font-to-afm-pfa-fpdf-tcpdf Сначала вам нужно будет преобразовать OTF в TTF, но я думаю, что есть другие сайты, которые довольно легко справятся с этим аспектом. Другая проблема, с которой вы можете столкнуться, заключается в том, что многие (большинство? все?) шрифты OTF/TTF имеют двухбайтовую кодировку, но шрифты PostScript, в которые и addTTFfont(), и этот веб-сайт конвертируют, используют однобайтовую кодировку. кодировку, что означает, что вы получите только первые 255 символов исходного шрифта. Удачи! - person JamesG; 18.10.2013
comment
@JamesG Не могли бы вы добавить фрагмент рабочего кода для шрифта OCR-B? У меня это не работает (возможно, проблема с путем или синтаксисом). - person PeterCo; 09.01.2018
comment
Я не могу предоставить рабочий фрагмент кода, если не знаю, какой это шрифт (например, TTF, OTF и т. д.). Даже в этом случае все, что вам действительно нужно сделать, это поиграться с функцией addTTFFont() и посмотреть, работает ли она. Дополнительную информацию о преобразовании шрифтов можно найти здесь: tcpdf.org/docs/fonts - person JamesG; 11.01.2018

Добавление нового шрифта TCPDF и метод решения проблемы с турецким чаром.

Используйте ссылку на конвертер:

  1. http://fonts.snm-portal.com
  2. Скачать 3 файла,
  3. Копировать TCPDF-мастер/шрифты
  4. Использование: $pdf->SetFont('roboto', '', 14);

введите описание изображения здесь

person Limitless isa    schedule 23.03.2018

Чтобы решить эту проблему с генерацией font.

Убедитесь, что все пути указаны правильно.

Воспользуйтесь этой ссылкой.

Не забудьте поместить папку make_font в папку html2pdf

Помните о правильном пути к: html2pdf.class.php внутри папки make_font в index.php

or

Если у вас есть другая проблема - шрифт: Не удалось включить файл определения шрифта:

Это проблема правильного названия вашего нового шрифта.

Например, используя при создании pdf:

Правильно: $html2pdf->addFont('lato i', '', 'latoi.php');

Неправильно: $html2pdf->addFont('lato', '', 'latoi.php');

Помните, что создаются только 2 файла:

latoi.php

latoi.z

Вам не нужен файл ctg.

Надеюсь, это поможет

person Tom Sawin    schedule 16.02.2017

В моем случае проблема заключалась в том, что путь к шрифтам был недоступен для записи. Я исправил это, изменив права доступа к папке: var_dump(K_PATH_FONTS);

person Dion    schedule 29.03.2020

В моем случае это был просто неверный путь к (больше не найденному) файлу шрифта .ttf. Для теста я успешно использовал диск D:/, но забыл изменить его обратно на рабочий диск C:/ в моем файле php в строке кода, где я использую команду addTTFfont('C:/...').

К сожалению, сообщение об ошибке TCPDF ничего не сообщает об исходном файле и строке кода, вызвавшей проблему.

person PeterCo    schedule 03.07.2020