Web-разработка

FPDF — Урок 7: Добавление новых шрифтов и поддержка разных кодировок

, , , ,
30 января 2010, 16:00

Сегодня я заканчиваю вольный перевод уроков с официального сайта библиотеки FPDF. Предыдущие мои переводы:

В этом Уроке мы рассмотрим, как использовать Type1 или TrueType шрифты так, что бы можно было использовать не только стандартные шрифты. Другой особенностью является то что, вы сможете выбрать шрифт, кодировку, которая позволит Вам использовать не только западные но и другие Языки (стандартные шрифты имеют слишком мало доступных символов).

Существует два способа использования нового шрифта: вложенные шрифты в PDF или подключаемые. Если указанный Вами шрифт не встроен, то он будет искаться в системе. Преимущество подключаемых шрифтов заключается в том, что файл PDF гораздо легче весит, а с другой стороны, если он не доступен, то используется подстановка стандартного шрифта. Поэтому желательно, чтобы шрифт был установлен на клиентских системах. Если файл будет просматриваться не только на вашем локальном компьютере, то обязательно нужно его вставить в PDF.

Что бы добавить новые TrueTypes шрифты, нужно сделать три шага:

  • Сгенерировать файл метрики (.afm)
  • Сгенерировать файл определения шрифта(.php)
  • Объявить шрифт в сценарии

Для Type1, теоретически генерировать файл AFM не является необходимым, так как обычно файл поставляется вместе со шрифтом. В случае, если у вас есть только метрический файл в формате PFM, ты Вы сможете воспользоваться конвертером который предоставлен на сайте FPDF — http://www.fpdf.org/fr/dl.php?id=34.

Генерация файла метрики

Первым шагом для TrueType является создание AFM-файла. Для этого нужно воспользоваться утилитой ttf2pt1. Бинарный файл для Windows доступен по следующему адресу — http://www.fpdf.org/fr/dl.php?id=22.
Чтобы воспользоваться утилитой ttf2pt1 в командной строке следует ввести следующее :
ttf2pt1 -a font.ttf font

Возьмем например шрифт Comic Sans MS Обычный:
ttf2pt1 -a c:\windows\fonts\comic.ttf comic

С помощью этой утилиты создаются два файла один из которых является файл с расширением .afm который собственно нам и нужен.

Генерация файла для определения шрифта

Вторым шагом является создание PHP файла, который содержит всю необходимую информацию для FPDF. Для того чтобы чтобы это сделать, в каталоге font/makefont Вы сможете найти дополнительный скрипт в фале makefont.php, который содержит следующие функции:
MakeFont( string fontfile, string afmfile [, string enc [, array patch [, string type]]])

Значения которые принимает метод, в качестве параметров:

  • fontfile — Путь к файлу с расширением .ttf или .pfb.
  • afmfile — Путь к файлу с расширением .afm.
  • enc — Название используемой кодировки. По умолчанию cp1252.
  • patch — Дополнительные изменения касающиеся кодировки. По умолчанию пуст.
  • type — Тип шрифта ( TrueType или Type1 ). По умолчанию TrueType.

Первым параметром должно быть имя и путь к шрифту. Расширение должно быть .ttf или .pfb. Если у вас есть шрифт Type1 в ASCII формате с расширением .pfa, Вы можете преобразовать его в двоичном формате с помощью утилиты t1utils.

Ранее сгенерированный файл AFM

Кодировка определяет связь между кодом (от 0 до 255) и характер. Первые 128 являются фиксированными и соответствуют ASCII, а следующие являются переменными. Кодировки хранятся в .map файлах. Кодировки бывают следующие:

  • cp1250 (Central Europe)
  • cp1251 (Cyrillic)
  • cp1252 (Western Europe)
  • cp1253 (Greek)
  • cp1254 (Turkish)
  • cp1255 (Hebrew)
  • cp1257 (Baltic)
  • cp1258 (Vietnamese)
  • cp874 (Thai)
  • ISO-8859-1 (Western Europe)
  • ISO-8859-2 (Central Europe)
  • ISO-8859-4 (Baltic)
  • ISO-8859-5 (Cyrillic)
  • ISO-8859-7 (Greek)
  • ISO-8859-9 (Turkish)
  • ISO-8859-11 (Thai)
  • ISO-8859-15 (Western Europe)
  • ISO-8859-16 (Central Europe)
  • KOI8-R (Russian)
  • KOI8-U (Ukrainian)

Шрифт который Вы выберете должен содержать символы, соответствующие выбранной кодировке.
В особенных случаях когда символы шрифта не содержат литеры, такие, как Symbol или ZapfDingbats, нужно передать пустую строку.
Кодировки, которые начинаются с СР, используются в ОС Windows. Linux системы обычно используют ISO.
Примечание: стандартные шрифты используют кодировку cp1252.

Четвертый параметр дает возможность изменять кодировку. Иногда Вы можете добавить несколько символов. Так, например, ISO-8859-1 не содержит символ евро. Чтобы добавить его на позицию 164, нужно передать — array(164=>’Euro’).

Последний параметр используется для передачи типа шрифта, в случае, если он не встроены (то есть если первый параметр пуст).

После того как Вы заполнили все параметры функции, Вы можете создать новый файл подключив при этом makefont.php, или просто добавить вызов функции непосредственно внутрь основного файла. После исполнения функции будет создано несколько файлов:.php и .afm. При желании Вы можете переименовать файл. Помимо этого скрипт создает файл с расширением .z, который является сжатым (за исключением случаев, когда функция сжатия недоступна, она требует Zlib). Вы можете переименовать и его тоже, но в этом случае Вы должны изменить переменную $file в .php файле, с соответствующим именем.

Пример:

 MakeFont('c:\\windows\\fonts\\comic.ttf','comic.afm','cp1252');

Выше приведенный пример создаст два файла: comic.php и comic.z.

Когда Вы получите эти файлы, их нужно скопировать в каталог с шрифтами. Если файл шрифта не получился сжатым то скопируйте файлы с расширением .ttf или .pfb, вместо .z.

Примечание: для шрифтов TTF, Вы можете не делать этого в ручную а скачать эти файлы с помощью утилиты по этому адресу: http://fpdf.fruit-lab.de/. Я думаю что использование данного скрипта не составит у Вас больших трудностей, но все таки: Нужно выбрать файл TTF с компьютера, и потом при нажатии на единственную кнопку получите нужные файлы для FPDF.

Объявление шрифта в сценарии

Последний шаг является наиболее простым. Вам просто нужно вызвать AddFont () метод. Например:

 $pdf->AddFont('Comic','','comic.php');

или можно еще проще:

 $pdf->AddFont('Comic');

Теперь шрифт можно использовать. Если бы Вы выбрали другой шрифт, например Comic Sans MS Bold (comicbd.ttf), то нужно объявить его так:

 $pdf->AddFont('Comic','B','comicbd.php');

Пример

Давайте посмотрим, маленький полностью рабочий пример. Будет использоваться шрифт Calligrapher, который Вы можете скачать на сайте — http://www.abstractfonts.com/ (сайт, предлагает большое количество бесплатных TrueType шрифтов). Ссылка для загрузки шрифта — http://www.abstractfonts.com/download/52. Первым шагом является генерация AFM-файла:
ttf2pt1 -a calligra.ttf calligra

которая дает calligra.afm (и calligra.t1a, который можно удалить). Затем мы создаем файл определения:

require('font/makefont/makefont.php');
MakeFont('calligra.ttf','calligra.afm');

Вызов функции даст следующие сообщения:
Warning: character Euro is missing
Warning: character eth is missing
Font file compressed (calligra.z)
Font definition file generated (calligra.php)

Символ Euro отсутствует, так как слишком старый. Другие символы также отсутствуют, однако они нам не понадобятся.
Теперь можно скопировать два файла в директорию и написать сценарий:

require('fpdf.php');
$pdf=new FPDF();
$pdf->AddFont('Calligrapher','','calligra.php');
$pdf->AddPage();
$pdf->SetFont('Calligrapher','',35);
$pdf->Cell(0,10,'Enjoy new fonts with FPDF!');
$pdf->Output();

Вот что должно получиться в итоге:

FPDF - Урок 7: Добавление новых шрифтов и поддержка разных кодировок

О символе евро

В разных кодировках символ евро расположен на разных позициях да и вообще бывает он не во всех кодировках:

Кодировка
Позиция
cp1250
128
cp1251
136
cp1252
128
cp1253
128
cp1254
128
cp1255
128
cp1257
128
cp1258
128
cp874
128
ISO-8859-1
отсутствует
ISO-8859-2
отсутствует
ISO-8859-4
отсутствует
ISO-8859-5
отсутствует
ISO-8859-7
отсутствует
ISO-8859-9
отсутствует
ISO-8859-11
отсутствует
ISO-8859-15
164
ISO-8859-16
164
KOI8-R
отсутствует
KOI8-U
отсутствует

Кодировка ISO-8859-1 широко распространена, но не включает знак евро. Если Вам это нужно, самое простое, что можно сделать это использовать cp1252 или ISO-8859-15 вместо этой кодировки, потому что они почти идентичны, но содержат драгоценный символ.
Вместо ISO-8859-2, можно использовать ISO-8859-16, но эта кодировка содержит много различий. Поэтому здесь проще добавить в кодировку этот символ, как описано выше. То же самое верно и для других кодировок.

Соединение шрифтов под Windows

Если шрифт который Вы выбрали не доступен в том или ином стиле, Windows способен соединить его из обычной версии. Например, нет Comic Sans MS Italic, но он может быть построен из Comic Sans MS Regular. Эта функция может быть использована в файле PDF, но, к сожалению требует, чтобы обычный шрифт присутствовал в системе. Вот как это можно сделать:

  • Создать файл для определения обычного шрифта без вложения (можете, переименовать его, чтобы отразить необходимый стиль)
  • Откройте его и добавьте к переменной $name после запятой необходимый стиль (Italic, Bold or BoldItalic)

Например, для файла comici.php это будет выглядеть следующим образом:

$name='ComicSansMS,Italic';

Тогда можно использовать его как обычный шрифт:

$pdf->AddFont('Comic','I','comici.php');

Уменьшение размера TrueType шрифтов

Файлы шрифтов часто очень объемные по размеру(более 100, и даже 200 КБ), это связано с тем, что они содержат символы, которые соответствуют для многих кодировок. Zlib сжатие уменьшает их, но они остаются достаточно большими. НО все же есть методика, которая поможет еще уменьшить. Методика состоит в том что при преобразовании шрифта Type1 с помощью ttf2pt1 нужно указать кодировку которая Вам нужна, и все символы соответствующие другим кодировкам будут проигнорированы.
Например, шрифт arial.ttf который поставляется с Windows 98 весит 267KB (он содержит 1296 знаков). После сжатия будет 147. Давайте преобразуем его в Type1, сохраняя только символы нужные для кодировки cp1250:
ttf2pt1 -b -L cp1250.map c:\windows\fonts\arial.ttf arial

Файлы .map находятся в директории font/makefont/. При исполнении команды будут созданы некоторые файлы в числе которых: arial.pfb и arial.afm. Вес файла arial.pfb до сжатия составлял 35KB, а после 30KB.

Можно пойти еще дальше. Если Вас интересует только некоторые символы из общего количества 217 символов, Вы можете открыть файл с расширением .map и удалить ненужные строки, что соответственно позволит уменьшить вес файла.

Ссылки:

Удачного Вам использования!