我们有一个基于Java和ImageMagick的上传服务,可以生成所需的资产,以便包含在生成的文档中。
但是...
当用户上传引用非嵌入字体的EPS(或类似内容),而不是抛出错误时,ImageMagick只是将字体替换为自己设计的字体。
这意味着:
因此...
有没有办法让ImageMagick报告未嵌入字体和/或任何可以让我们查询上传的EPS文件以找到丢失字体的替代方法?
答案 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进行更复杂的处理。