ImageMagick 能否检测到 EPS 文件中丢失和未嵌入的字体?

Can ImageMagick detect missing and non-embedded fonts in EPS files?

我们有一个基于 Java 和 ImageMagick 的上传服务来生成所需的资产以适当地包含在生成的文档中。

但是...

当用户上传引用非嵌入字体的 EPS(或类似文件)时,ImageMagick 不会抛出错误,而是简单地用自己设计的字体替换字体。

这意味着:

  1. 当他们的徽标看起来完全无法辨认时,用户会感到震惊
  2. 当打印软件抱怨它不知道要使用什么字体时,我们收到渲染错误

所以...

是否有任何方法可以让 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 进行更复杂的处理。