如何使用Ghostscript正确嵌入Windows字体文件夹内的字体到PDF
问题描述
- 开发场景:基于C#开发控制台应用,需求为将
C:\Windows\Fonts路径下的系统字体嵌入PDF文件 - 已尝试方案:本地安装Ghostscript 9.56.1,先后执行两条字体嵌入命令:
gswin64c -dNOPAUSE -dBATCH -dNOPLATFONTS -sDEVICE=pdfwrite -dEmbedAllFonts=true -sOutputFile=output.pdf -f 1.pdf
gswin64c -dNOPAUSE -dBATCH "-sFONTMAP=C:/Program Files/gs/gs9.56.1/Resource/Init/Fontmap.GS -sFONTPATH#C:\Windows\Fonts" -sDEVICE=pdfwrite -sOutputFile=output.pdf -f 1.pdf
- 自定义配置:在
Fontmap.GS文件末尾添加如下映射规则:
/MyFont-Regular (/MyFont-Regular.ttf) ;
- 故障现象:命令可正常生成输出PDF,但目标字体未成功嵌入,文件内实际嵌入的是默认替代字体
NimbuSans-Regular,效果参考截图:
- 待解答疑问:
- Ghostscript字体目录
C:\Program Files\gs\gs9.56.1\Resource\Font内的字体文件采用什么扩展名? - 如何将自定义字体添加到上述Ghostscript字体目录?
- Ghostscript字体目录
- 其他尝试:曾使用iTextSharp实现字体嵌入,但存在嵌入自定义字体后PDF版式错乱、无法保持原有排版的问题,需基于Ghostscript实现Windows 10已安装字体的正确嵌入。
解决方案
修正命令语法错误
第二条命令存在两处语法错误,导致字体路径配置完全不生效:
- 将
-sFONTMAP和-sFONTPATH两个独立参数放在同一对引号内,Ghostscript会将整段内容识别为FONTMAP的参数值,无法读取FONTPATH配置 -sFONTPATH参数赋值应使用=而非#,路径包含空格时需用英文双引号包裹
可正常加载系统字体的基础命令如下:
gswin64c -dNOPAUSE -dBATCH ^ -sDEVICE=pdfwrite ^ -dEmbedAllFonts=true ^ -dSubsetFonts=false ^ -dPDFSETTINGS=/prepress ^ -sFONTPATH="C:\Windows\Fonts" ^ -sOutputFile=output.pdf ^ 1.pdf
如需指定自定义Fontmap路径,需将参数单独拆分书写,不要与其他参数放在同一引号内:
-sFONTMAP="C:/Program Files/gs/gs9.56.1/Resource/Init/Fontmap.GS" ^注意:如需Ghostscript自动匹配Windows目录下的字体,需移除
-dNOPLATFONTS参数,该参数作用为禁用系统平台字体的自动加载逻辑,开启后未手动映射的字体将直接走内置替代规则。
修复字体映射规则
字体被替换为NimbuSans-Regular的核心原因是字体匹配失败:
Fontmap中配置的字体别名/MyFont-Regular与原PDF内引用的字体PostScript名称不匹配,Ghostscript无法找到对应字体文件,自动fallback到内置替代字体。
正确配置映射的方法:
- 先通过PDF阅读器或字体查看工具,获取原PDF中引用的目标字体的PostScript名称(注意是字体内部的PS名,不是字体文件名,例如微软雅黑常规的PS名为
MicrosoftYaHei,对应文件为msyh.ttc) - Fontmap中的映射规则需匹配正确的PS名,且字体文件路径必须写绝对路径,不要写相对路径。常规ttf字体映射示例:
/MicrosoftYaHei (C:/Windows/Fonts/msyh.ttf) ;
- 如果是ttc格式的字体集合文件,需额外指定字体在集合内的索引值,例如微软雅黑粗体在
msyh.ttc中的索引为1,映射写法为:
/MicrosoftYaHei-Bold (C:/Windows/Fonts/msyh.ttc) 1 index ;
Ghostscript字体目录相关说明
C:\Program Files\gs\gs9.56.1\Resource\Font目录支持三类字体格式,对应扩展名如下:.pfb:Type1格式PostScript字体,需配套同文件名的.pfm字体度量文件使用.ttf/.ttc:TrueType单字体文件/TrueType字体集合文件.otf:OpenType格式字体
- 往该目录添加自定义字体无特殊规则,直接将字体文件复制到目录下即可。但不推荐直接修改Ghostscript安装目录内容,优先通过
-sFONTPATH参数指定自定义字体目录,避免后续升级Ghostscript版本时丢失自定义配置。
C#调用注意事项
开发控制台程序调用Ghostscript时,直接通过Process类启动gswin64c.exe即可,无需通过cmd转调,避免引号转义导致参数失效。核心调用代码示例:
var gsStartInfo = new ProcessStartInfo { FileName = @"C:\Program Files\gs\gs9.56.1\bin\gswin64c.exe", Arguments = "-dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dEmbedAllFonts=true -dPDFSETTINGS=/prepress -sFONTPATH=\"C:\\Windows\\Fonts\" -sOutputFile=\"output.pdf\" \"1.pdf\"", UseShellExecute = false, CreateNoWindow = true }; using var gsProcess = Process.Start(gsStartInfo); gsProcess.WaitForExit();
内容的提问来源于stack exchange,提问作者mck
相关产品推荐
相关产品推荐

