如何使用 Ghostscript 将 TTF-Format 中的字体嵌入到 PDF 中?

How to use Ghostscript to embed fonts in TTF-Format into PDFs?

Atm 我想使用 GhostScript v9.26(在 Debian 上)并将字体嵌入到 PDF 中。 我使用“Roboto”字体。但每次我使用 GhostScript 嵌入字体时,它并没有嵌入 Roboto,而是嵌入了“Helvetica”和“Arial”,它们甚至没有在我的 PDF 中使用。

我认为这只是退回到其他一些字体,因为它无法加载我的 Roboto.ttf 字体

-sFONTPATH='../../templates/fonts/Roboto/'

我听说我首先必须将我的 TTF 字体转换为某种 FontMap。但是具体怎么做呢?

我执行 GhostScript 的命令(来自 PHP)是这样的:

exec("gs -o '../../archiv/tmp/Ghost.pdf' -sDEVICE=pdfwrite -sFONTPATH='../../templates/fonts/Roboto/' '../../archiv/tmp/source.pdf'");

source.pdf 不包含任何与“Roboto”相关的任何其他字体 我已经用 Adob​​e Acrobat DC Pro 仔细检查了这一点。 但是 Ghost.pdf 确实如此。它确实具有所有 3 种字体,而且最重要。已经“Roboto”但还没有嵌入的部分现在是ArialHelvetica。 已经嵌入的部分保持原样。

例子 source.pdf(截图): (Roboto)

Ghost.pdf(截图): (Arial)

我是否必须将 TTF 字体转换为 OTF/WOFF/WOFF2/SVG 或任何其他通用格式才能将它们与 GhostScript 一起使用?

正如您所想,TTF 字体可以直接被ghostscript 使用。 -sFONTPATH 也适用于我的测试,以产生带有 pdfwrite 的 TTF 源嵌入字体,正如您再次发现的那样。所以这一定是一个 php 问题。如果 php 正在更改目录,-sFONTPATH 中的绝对路径可能会更好。

也可以将各种字体复制到工作目录,然后使用gs -P选项在当前目录中查找字体。这需要通过“字体文件名”指定字体,例如:

/Roboto-Regular.ttf 12 selectfont

我刚刚测试了将 Roboto-Regular.ttf 重命名为 Roboto-Regular 的基本名称,ghostscript 能够使用 gs -P 在当前目录中正确找到字体,因此所有字体名称都不会如果有帮助就不需要更改:

/Roboto-Regular 12 selectfont

编辑:要将 TTF 字体添加到 Fontmap,只需找到 ghostscript 使用的实际字体名称并添加到 Fontmap。 fontforge 是一种查找字体名称的简单方法,因为有时很难使用 TTF 文件。另一种方法是将 TTF 转换为 type42,以便在文件中查找并找到 /FontName。如果使用系统范围的 Fontmap 或没有目录 Fontmap 的完整路径,则像这样添加到 Fontmap(我想知道 -sFONTPATH 是否是可选的完整路径):

(Roboto-Black)          (/usr/local/share/fonts/Roboto-Black.ttf)       ;
(Roboto-BlackItalic)            (/usr/local/share/fonts/Roboto-BlackItalic.ttf) ;
(Roboto-Bold)           (/usr/local/share/fonts/Roboto-Bold.ttf)        ;
(Roboto-BoldItalic)             (/usr/local/share/fonts/Roboto-BoldItalic.ttf)  ;
(Roboto-Italic)         (/usr/local/share/fonts/Roboto-Italic.ttf)      ;
(Roboto-Light)          (/usr/local/share/fonts/Roboto-Light.ttf)       ;
(Roboto-LightItalic)            (/usr/local/share/fonts/Roboto-LightItalic.ttf) ;
(Roboto-Medium)         (/usr/local/share/fonts/Roboto-Medium.ttf)      ;
(Roboto-MediumItalic)           (/usr/local/share/fonts/Roboto-MediumItalic.ttf)        ;
(Roboto-Regular)                (/usr/local/share/fonts/Roboto-Regular.ttf)     ;
(Roboto-Thin)           (/usr/local/share/fonts/Roboto-Thin.ttf)        ;
(Roboto-ThinItalic)             (/usr/local/share/fonts/Roboto-ThinItalic.ttf)  ;
(RobotoCondensed-Bold)          (/usr/local/share/fonts/RobotoCondensed-Bold.ttf)       ;
(RobotoCondensed-BoldItalic)            (/usr/local/share/fonts/RobotoCondensed-BoldItalic.ttf) ;
(RobotoCondensed-Italic)                (/usr/local/share/fonts/RobotoCondensed-Italic.ttf)     ;
(RobotoCondensed-Light)         (/usr/local/share/fonts/RobotoCondensed-Light.ttf)      ;
(RobotoCondensed-LightItalic)           (/usr/local/share/fonts/RobotoCondensed-LightItalic.ttf)        ;
(RobotoCondensed-Regular)               (/usr/local/share/fonts/RobotoCondensed-Regular.ttf)    ;
(RobotoMono-Bold)               (/usr/local/share/fonts/RobotoMono-Bold.ttf)    ;
(RobotoMono-BoldItalic)         (/usr/local/share/fonts/RobotoMono-BoldItalic.ttf)      ;
(RobotoMono-Italic)             (/usr/local/share/fonts/RobotoMono-Italic.ttf)  ;
(RobotoMono-Light)              (/usr/local/share/fonts/RobotoMono-Light.ttf)   ;
(RobotoMono-LightItalic)                (/usr/local/share/fonts/RobotoMono-LightItalic.ttf)     ;
(RobotoMono-Medium)             (/usr/local/share/fonts/RobotoMono-Medium.ttf)  ;
(RobotoMono-MediumItalic)               (/usr/local/share/fonts/RobotoMono-MediumItalic.ttf)    ;
(RobotoMono-Regular)            (/usr/local/share/fonts/RobotoMono-Regular.ttf) ;
(RobotoMono-Thin)               (/usr/local/share/fonts/RobotoMono-Thin.ttf)    ;
(RobotoMono-ThinItalic)         (/usr/local/share/fonts/RobotoMono-ThinItalic.ttf)      ;
(RobotoSlab-Bold)               (/usr/local/share/fonts/RobotoSlab-Bold.ttf)    ;
(RobotoSlab-Light)              (/usr/local/share/fonts/RobotoSlab-Light.ttf)   ;
(RobotoSlab-Regular)            (/usr/local/share/fonts/RobotoSlab-Regular.ttf) ;
(RobotoSlab-Thin)               (/usr/local/share/fonts/RobotoSlab-Thin.ttf)    ;

这也有效:

/Roboto-Regular  (/usr/share/fonts/TTF/Roboto-Regular.ttf) ;

EDIT2:此外,还有一个名为 ttfontmap 的 perl 程序可以轻松生成 Fontmap 文件,而无需先找到 /FontName,除了 ttfontmap 取决于 ttf2pt1 程序。

刚刚发现将 Fontmap 文件放入工作目录可以使用 gs -P 选项正确找到字体。例如:

/Candara-Bold    (Candara_Bold.ttf);
/Hack-Regular    (/usr/share/fonts/TTF/Hack-Regular.ttf);

注意 Candara 文件名与 FontName 不同,字体可以在任何地方。只需确保 运行 gs -P 与所需的自定义 Fontmap 位于同一目录中。