如何使用 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”相关的任何其他字体 我已经用 Adobe Acrobat DC Pro 仔细检查了这一点。
但是 Ghost.pdf
确实如此。它确实具有所有 3 种字体,而且最重要。已经“Roboto
”但还没有嵌入的部分现在是Arial
或Helvetica
。
已经嵌入的部分保持原样。
例子
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 位于同一目录中。
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”相关的任何其他字体 我已经用 Adobe Acrobat DC Pro 仔细检查了这一点。
但是 Ghost.pdf
确实如此。它确实具有所有 3 种字体,而且最重要。已经“Roboto
”但还没有嵌入的部分现在是Arial
或Helvetica
。
已经嵌入的部分保持原样。
例子
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 位于同一目录中。