PHP 8.3.4 Released!

ps_findfont

(PECL ps >= 1.1.0)

ps_findfontЗагружает шрифт

Описание

ps_findfont(
    resource $psdoc,
    string $fontname,
    string $encoding,
    bool $embed = false
): int

Загружает шрифт для дальнейшего использования. Перед выводом текста с загруженным шрифтом он должен быть установлен с помощью ps_setfont(). Функция нуждается в файле метрики шрифта Adobe, чтобы вычислить пространство, используемое символами. Шрифт, загруженный на страницу, будет доступен только на этой странице. Шрифты, которые будут использоваться во всем документе, должны быть загружены до первого вызова ps_begin_page(). Вызов ps_findfont() между страницами сделает шрифт доступным для всех следующих страниц.

Имя afm-файла должно быть fontname.afm. Если шрифт должен быть встроен, также должен присутствовать файл fontname.pfb, содержащий контур шрифта.

Вызов ps_findfont() перед первой страницей требует вывода заголовка PostScript, который включает BoundingBox для всего документа. Обычно BoundingBox устанавливается при первом вызове ps_begin_page(), который теперь идёт после ps_findfont(). Следовательно, BoundingBox не установлен, и при вызове ps_findfont() будет выдано предупреждение. Чтобы предотвратить эту ситуацию, следует вызвать ps_set_parameter() для установки BoundingBox до вызова ps_findfont().

Список параметров

psdoc

Идентификатор ресурса файла postscript, возвращённый функцией ps_new().

fontname

Название шрифта.

encoding

Функция ps_findfont() попытается загрузить файл, переданный в параметре encoding. Файлы кодирования имеют тот же синтаксис, что и используемые dvips(1). Они содержат вектор кодировки шрифта (который в настоящее время не используется, но должен присутствовать) и список дополнительных лигатур для расширения списка лигатур, полученных из файла afm.

encoding может быть null или пустой строкой, если должна использоваться кодировка по умолчанию (TeXBase1).

Если для кодировки установлено значение builtin, то перекодирования не будет и будет использоваться кодировка, специфичная для шрифта. Это очень полезно для символьных шрифтов.

embed

Если установлено значение > 0, шрифт будет встроен в документ. Для этого требуется наличие контура шрифта (файл .pfb).

Возвращаемые значения

Возвращает идентификатор шрифта или ноль в случае возникновения ошибки. Идентификатор - положительное число.

Смотрите также

  • ps_begin_page() - Начинает новую страницу
  • ps_setfont() - Устанавливает шрифт, который будет использоваться для следующего вывода

add a note

User Contributed Notes 4 notes

up
1
zeldorblat at gmail dot com
18 years ago
I found that my Postscript files were taking an incredibly long time to generate and the file sizes were abnormally large. The problem was that, everytime I chose to set a font I would call ps_findfont() followed by ps_setfont().

It seems that every time ps_findfont() is called, the font gets embedded in the file. To prevent this, I keep an array of fonts I've already loaded, keyed by the font name. When I go to set the font, I first check this array to see if I've already loaded the font, and, if so, return the resource handle from that array. Otherwise, I call ps_findfont() and store the handle in the array.

Note that, if your call to ps_findfont() occurs while inside a page, the font will not be available on other pages. To get around this I just clear out the array at the end of each page.

My PS file went from 10 M to 75 K, and the time to create the file went from around 15 seconds to less than 1 second.
up
1
yarych at bigmir dot net
16 years ago
I've found out that pslib is searching for fonts in its data dir (/usr/share/pslib). There is no way to change the search path now.
up
1
pepe at dexef dot hu
17 years ago
I found out that you must copy the <fontname>.afm files next to your php because it's searched there in default.
up
0
yarych at bigmir dot net
15 years ago
Ok, now I found the way to set the path I need for fonts - before calling ps_findfont() make a call like this:
<?php ps_set_parameter($psdoc, 'SearchPath', $fonts_dir); ?>

It works for pslib 0.4.1 version. (Looks like it didn't work in some earlier versions.)
To Top