0

我从 NCL 脚本中获得了一个附有 mpDataBaseVersion = "HighRes"(高分辨率地图)的后记文件。我在 RHEL 5.6 i386 中运行了 ImageMagick 6.2.8。

当我跑的时候convert high-resolution.ps test.png,我得到了:

Error: /undefinedresult in --ashow--

Operand stack:
   0   0   ( )

Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   1910   1   3   %oparray_pop   1909   1   3   %oparray_pop   1893   1   3   %oparray_pop   1787   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--

Dictionary stack:
   --dict:1171/1684(ro)(G)--   --dict:0/20(G)--   --dict:143/200(L)--

Current allocation mode is local
Current file position is 629039

但是在使用 ImageMagick 5.5.6 的 RHEL 3 i386 中,相同的后记转换没有错误,怎么会?

我用谷歌搜索了一段时间,但我仍然不知道 undefinedresult 导致 ashow 错误。
执行堆栈是什么意思?


[更新]

谢谢@Fred 和@Ken!
我在下面重组了我的问题:

我有一个很大的 PostScript 文件 (9.3 MB):high_resolution.ps

电脑甲:

  • 红帽企业 Linux ES 第 3 版(Taroon 更新 3)i386
  • 转换版本:ImageMagick 5.5.6 04/01/03 Q16
  • Ghostscript 版本:GNU Ghostscript 7.05 (2002-04-22)

电脑乙:

  • 红帽企业 Linux 服务器版本 5.6 (Tikanga) i386
  • 转换版本:ImageMagick 6.2.8 05/07/12 Q16
  • Ghostscript 版本:GPL Ghostscript 8.70 (2009-07-31)

convert high_resolution.ps high_resolution.png 在 PC A 中工作,但在 PC B 中无效。

错误在上面。
我检查了 Ghostscript 更新日志,我对此一无所知(也许我只是错过了它?)

非常感谢!谢谢!</p>

4

2 回答 2

1

ashow 显示文本,并为字符添加了额外的空间。堆栈 0 0 告诉系统向字符添加零额外空间。( ) 是要显示的文本,它看起来是一个空格,但如果没有看到二进制文件的实际文件,它也可能是一个不可显示的字符。

如果字符是未定义的特殊字符,例如制表符或 null,则 undefinedresult 是有意义的。有一个只有 1 个字符的字符串也可能没有意义。

如前所述,什么版本的ghostscript 和查看实际文件会有所帮助。事后转储并不是特别有用,但执行堆栈看起来像是错误来自更复杂的上下文。

于 2013-04-20T22:24:42.683 回答
1

几乎可以肯定您使用的是不同版本的 Ghostscript(ImageMagick 使用它来处理 PostScript)。您在每个版本上安装了哪个版本的 Ghostscript?

Undefinedresult 的意思是,操作的结果是未定义的(这通常是由被零除引起的)。执行堆栈告诉您解释器遇到错误时执行堆栈上的内容。除非您了解 Postscript(老实说,Ghostscript 解释器),否则它不会告诉您任何有意义的信息。

如果没有看到导致错误的文件,我就不能再说什么了。请记住,PostScript 是一种编程语言,因此错误消息只是一个起点。

更新

我已经检索了该文件,并且可以确认通过当前版本的 Ghostscript 运行它时出现错误。Adobe Acrobat Distiller 给出了一个非常相似的错误(未定义的结果与 setcachedevice),因此它实际上可以确定该文件是非法的。当我有机会确定原因时,我会说更多。

附带说明一下,这两个版本的 Ghostscript 都非常老,当前版本是 9.07

[更新 2]

违规行非常靠近文件的开头:

/Helvetica 0 Fs 0 0 ( ) 作为 Gr

因为 PostScript 是一种编程语言,所以这个片段使用了程序中定义的一些过程。它所做的是找到一个名为“Helvetica”的字体,将其缩放到 0 的大小,然后显示字符串“”,将每个字形的宽度调整为 0。

其中有几个部分显然是无稽之谈;将字体缩放到 0 将使其无用,最多一个字形将标记 1 个像素。使用运算符显示字符串以将每个字形的宽度调整为 0 显然是没有意义的。更智能的软件不会生成这样的 PostScript 程序,但从相当简单的文件序言中可以看出,制作者显然在生成 PostScript 方面不是很聪明。

基本上问题正是 GS 所说的,x 和 y 宽度是通过使用矩阵来调整的,并且将矩阵乘法应用于字体大小为 0 的结果确实是未定义的。

您最好的选择可能是返回原始应用程序并删除导致文本“ ”发出的任何内容。

如果由于某种原因这是不可能的,您可以利用 PostScript 是一种编程语言这一事实​​,您可以自己重新定义 /ashow 运算符,如果字体大小为 0,则让它不执行任何操作,例如:

/old_ashow /ashow load def /ashow {currentfont /FontMatrix get aload pop pstack 0 1 4 {pop add} for 0 eq {pop pop pop}{old_ashow}ifelse} bind def

通常我会建议把它放在一个新文件中,并在你想要处理的文件之前通过 Ghostscript 运行它(例如'gs mod.ps high_resolution.ps'),但是因为你使用的是 ImagMagick,所以你不能这样做。因此,如果您想这样做,您需要修改 high_resolution.ps 文件并将其放在文件的顶部。每当您修改 PostScript 文件时,您必须小心使用可以处理二进制文件且不会更改 CR/LF 行结尾的编辑器。

请注意,我不建议这样做,最好修复生成此 PostScript 程序的原始文件或脚本,以便您可以在其他地方使用它(例如打印)。就目前而言,它正在生产非法的 PostScript。

至于为什么(非常)旧版本的 Ghostscript 不会发生错误;这几乎可以肯定是一个疏忽。Adobe Postscript 语言参考手册列出了每个操作员可能出现的错误,但并未列出引发错误的所有可能情况。很明显,这个错误条件是在 7.05 发布之后添加的,几乎可以肯定,当问题引起开发人员注意时。

于 2013-04-19T07:28:00.323 回答