ImageMagick 能否检测到 EPS 文件中丢失和未嵌入的字体?
Can ImageMagick detect missing and non-embedded fonts in EPS files?
我们有一个基于 Java 和 ImageMagick 的上传服务来生成所需的资产以适当地包含在生成的文档中。
但是...
当用户上传引用非嵌入字体的 EPS(或类似文件)时,ImageMagick 不会抛出错误,而是简单地用自己设计的字体替换字体。
这意味着:
- 当他们的徽标看起来完全无法辨认时,用户会感到震惊
- 当打印软件抱怨它不知道要使用什么字体时,我们收到渲染错误
所以...
是否有任何方法可以让 ImageMagick 报告未嵌入的字体and/or是否有任何替代方法可以让我们查询上传的 EPS 文件以找到丢失的字体?
获取此信息的最可靠方法是 运行直接使用 Ghostscript 并查看其输出。
我对 运行 说 "directly" 因为 ImageMagick 在处理 EPS 输入时无论如何都会 运行 它。 (ImageMagick 无法与 EPS、PS 或 PDF inputs 一起使用——因此它利用 Ghostscript 作为其 delegate
生成初始图像栅格数据,然后接管该数据以进行进一步处理)。
所以你可以这样做,例如(命令语法适用于 Linux、Unix 或 Mac OS X):
gs -o /dev/null -sDEVICE=pdfwrite unembedded-font-used.eps
在 Windows 你会 运行 像这样:
gswin64c.exe -o nul -sDEVICE=pdfwrite unembedded-font-used.eps
例如,Ghostscript 然后会在终端中报告此输出。这里是第一行:
GPL Ghostscript GIT PRERELEASE 9.18 (2015-04-07)
Copyright (C) 2015 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Can't find (or can't open) font file %rom%Resource/Font/ArialMT.
Can't find (or can't open) font file ArialMT.
Can't find (or can't open) font file %rom%Resource/Font/ArialMT.
Can't find (or can't open) font file ArialMT.
Querying operating system for font files...
现在下一行,如果没有找到 "good enough" 替换字体:
Error: /typecheck in /findfont
Operand stack:
Arial
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- 1919 1 3 %oparray_pop
Dictionary stack:
--dict:1190/1684(ro)(G)-- --dict:0/20(G)-- --dict:78/200(L)--
Current allocation mode is local
GPL Ghostscript GIT PRERELEASE 9.18: Unrecoverable error, exit code 1
第二部分看起来有点不同,如果 Ghostscript 找到一种字体来代替缺失的字体:
Loading NimbusSanL-Reg font from %rom%Resource/Font/NimbusSanL-Reg... 4674144 3087974 1934432 636034 1 done.
这样的行可能有多条。您将能够准确地看到 Ghostscript 将使用哪个字体文件。在上面的例子中,它将使用它在可执行文件中内置的字体,由输出的 %rom%
部分指示。如果在本地磁盘上找到字体,它会告诉完整路径。
请注意一个额外的细节:以上输出的一部分将针对 <stdin>
,另一部分将针对 <stdout>
。在上面的示例中,它们全部混合在一起,因为我是从我的终端复制的。如果您只想看到 <stderr>
.
,则必须根据需要自行采取适当的措施
当然,您也可以直接使用 Ghostscript 生成最终的 PNG、TIFF 或 JPEG 输出。也就是说,除非您之后需要 ImageMagick 进行更复杂的处理。
我们有一个基于 Java 和 ImageMagick 的上传服务来生成所需的资产以适当地包含在生成的文档中。
但是...
当用户上传引用非嵌入字体的 EPS(或类似文件)时,ImageMagick 不会抛出错误,而是简单地用自己设计的字体替换字体。
这意味着:
- 当他们的徽标看起来完全无法辨认时,用户会感到震惊
- 当打印软件抱怨它不知道要使用什么字体时,我们收到渲染错误
所以...
是否有任何方法可以让 ImageMagick 报告未嵌入的字体and/or是否有任何替代方法可以让我们查询上传的 EPS 文件以找到丢失的字体?
获取此信息的最可靠方法是 运行直接使用 Ghostscript 并查看其输出。
我对 运行 说 "directly" 因为 ImageMagick 在处理 EPS 输入时无论如何都会 运行 它。 (ImageMagick 无法与 EPS、PS 或 PDF inputs 一起使用——因此它利用 Ghostscript 作为其 delegate
生成初始图像栅格数据,然后接管该数据以进行进一步处理)。
所以你可以这样做,例如(命令语法适用于 Linux、Unix 或 Mac OS X):
gs -o /dev/null -sDEVICE=pdfwrite unembedded-font-used.eps
在 Windows 你会 运行 像这样:
gswin64c.exe -o nul -sDEVICE=pdfwrite unembedded-font-used.eps
例如,Ghostscript 然后会在终端中报告此输出。这里是第一行:
GPL Ghostscript GIT PRERELEASE 9.18 (2015-04-07)
Copyright (C) 2015 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Can't find (or can't open) font file %rom%Resource/Font/ArialMT.
Can't find (or can't open) font file ArialMT.
Can't find (or can't open) font file %rom%Resource/Font/ArialMT.
Can't find (or can't open) font file ArialMT.
Querying operating system for font files...
现在下一行,如果没有找到 "good enough" 替换字体:
Error: /typecheck in /findfont
Operand stack:
Arial
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- 1919 1 3 %oparray_pop
Dictionary stack:
--dict:1190/1684(ro)(G)-- --dict:0/20(G)-- --dict:78/200(L)--
Current allocation mode is local
GPL Ghostscript GIT PRERELEASE 9.18: Unrecoverable error, exit code 1
第二部分看起来有点不同,如果 Ghostscript 找到一种字体来代替缺失的字体:
Loading NimbusSanL-Reg font from %rom%Resource/Font/NimbusSanL-Reg... 4674144 3087974 1934432 636034 1 done.
这样的行可能有多条。您将能够准确地看到 Ghostscript 将使用哪个字体文件。在上面的例子中,它将使用它在可执行文件中内置的字体,由输出的 %rom%
部分指示。如果在本地磁盘上找到字体,它会告诉完整路径。
请注意一个额外的细节:以上输出的一部分将针对 <stdin>
,另一部分将针对 <stdout>
。在上面的示例中,它们全部混合在一起,因为我是从我的终端复制的。如果您只想看到 <stderr>
.
当然,您也可以直接使用 Ghostscript 生成最终的 PNG、TIFF 或 JPEG 输出。也就是说,除非您之后需要 ImageMagick 进行更复杂的处理。