2024 年 PHP 日本大会

ps_findfont

(PECL ps >= 1.1.0)

ps_findfont加载字体

描述

ps_findfont(
    资源 $psdoc,
    字符串 $fontname,
    字符串 $encoding,
    布尔值 $embed = false
): 整数

加载字体以供以后使用。在使用已加载的字体输出文本之前,必须使用 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() 在调用 ps_findfont() 之前设置 BoundingBox。

参数

psdoc

PostScript 文件的资源标识符,由 ps_new() 返回。

fontname

字体的名称。

encoding

ps_findfont() 将尝试加载参数 encoding 中传递的文件。编码文件与 dvips(1) 使用的文件语法相同。它们包含字体编码向量(目前未使用,但必须存在)以及扩展从 afm 文件派生的连字列表的额外连字列表。

encoding 可以是 null 或空字符串,如果要使用默认编码 (TeXBase1)。

如果将编码设置为 builtin,则不会进行重新编码,并将使用特定于字体的编码。这对于符号字体非常有用。

embed

如果设置为 >0 的值,则字体将嵌入到文档中。这需要字体轮廓(.pfb 文件)存在。

返回值

返回字体的标识符,如果发生错误则返回零。标识符是一个正数。

参见

添加笔记

用户贡献笔记 4 个笔记

2
zeldorblat at gmail dot com
19 年前
我发现我的 Postscript 文件生成速度非常慢,文件大小异常大。问题在于,每次我选择设置字体时,都会调用 ps_findfont(),然后调用 ps_setfont()。

似乎每次调用 ps_findfont() 时,字体都会嵌入到文件中。为防止这种情况,我保留了一个我已经加载的字体的数组,使用字体名称作为键。当我设置字体时,我首先检查此数组以查看我是否已经加载了字体,如果是,则从该数组返回资源句柄。否则,我调用 ps_findfont() 并将句柄存储在数组中。

请注意,如果您的 ps_findfont() 调用发生在页面内,则该字体在其他页面上将不可用。为了解决这个问题,我只是在每个页面的末尾清除数组。

我的 PS 文件从 10 MB 变成了 75 KB,创建文件的时间从大约 15 秒减少到不到 1 秒。
2
yarych at bigmir dot net
16 年前
我发现 pslib 在其数据目录 (/usr/share/pslib) 中搜索字体。现在无法更改搜索路径。
1
yarych at bigmir dot net
16 年前
好的,现在我找到了设置字体所需路径的方法 - 在调用 ps_findfont() 之前,进行如下调用
<?php ps_set_parameter($psdoc, 'SearchPath', $fonts_dir); ?>

它适用于 pslib 0.4.1 版本。(看起来它在某些早期版本中不起作用。)
0
pepe at dexef dot hu
18 年前
我发现您必须将 <fontname>.afm 文件复制到您的 php 文件旁边,因为它默认在那里搜索。
To Top