ImageMagick可以检测EPS文件中的缺失和非嵌入字体吗?

时间:2015-09-03 22:38:20

标签: fonts imagemagick image-uploading eps

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

但是...

当用户上传引用非嵌入字体的EPS(或类似内容),而不是抛出错误时,ImageMagick只是将字体替换为自己设计的字体。

这意味着:

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

    有没有办法让ImageMagick报告未嵌入字体和/或任何可以让我们查询上传的EPS文件以找到丢失字体的替代方法?

1 个答案:

答案 0 :(得分:1)

获取此信息的最可靠方法是直接运行Ghostscript并查看其输出。

我说要“直接”运行它,因为当你处理你的EPS输入时,ImageMagick无论如何都会运行它。 (ImageMagick无法使用EPS,PS或PDF 输入 - 因此它利用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...

现在下一行,如果没有“足够好”的替代字体,则会找到:

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进行更复杂的处理。