我从mpDataBaseVersion = "HighRes“(高分辨率地图)的NCL脚本中获得了一个postscript文件。我得到了ImageMagick 6.2.8在RHEL5.6 i386中运行。
当我运行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但是相同的postscript在RHEL 3 i386和ImageMagick 5.5.6中没有错误地转换,为什么呢?
我在googled上搜索了一段时间,但我仍然不知道这种不确定的结果会导致怎样的错误。
执行堆栈意味着什么?
更新
谢谢,弗雷德和肯!
我调整了我的问题如下:
我有一个大的PostScript文件(9.3MB):高
PC A:
PC B:
convert high_resolution.ps high_resolution.png 在PC A中工作,但在PC B.中不工作
错误在上面。
我检查了Ghostscript的变化,我什么也没有得到(也许我只是错过了?)
非常感谢!謝謝!
发布于 2013-04-19 07:28:00
几乎可以肯定,您使用的是不同版本的Ghostscript ( ImageMagick使用它来处理PostScript)。您在每个版本上都安装了什么版本的Ghostscript?
未定义结果指的是它所说的,操作的结果是未定义的(这通常是由除以零引起的)。执行堆栈告诉您在解释器遇到错误时执行堆栈上的内容。除非您理解Postscript (老实说,Ghostscript解释器),否则它不会告诉您任何有意义的事情。
如果没有看到导致错误的文件,我就不能再说了。记住,PostScript是一种编程语言,所以错误消息只是一个起点。
更新
我已经检索了该文件,并且在运行Ghostscript的当前版本时,我可以确认获得了该错误。Acrobat提供了一个非常类似的错误(在setcachedevice中未定义结果),因此几乎可以肯定该文件是非法的。当我有机会确定原因的时候我会说更多的。
另外,这两个版本的Ghostscript都很老,现在的版本是9.07
更新2
违规行非常接近文件的开头:
/Helvetica 0 Fs 0 0()作为Gr
因为PostScript是一种编程语言,所以这个片段使用了程序中定义的一些过程。它所做的是找到一个名为“Helvetica”的字体,将其缩放为0,然后显示字符串“调整每个字形的宽度为0”。
其中有几个部分显然是胡说八道;将字体缩放到0将使其无用,最多一个字形将标记为1像素。使用操作符将每个字形的宽度调整为0的字符串显然没有意义。更聪明的软件不会产生这样的PostScript程序,但是生产者在生成PostScript方面显然不是很聪明,从非常简单的prolog到文件中都可以看到。
基本上问题就是GS所说的,x和y的宽度是用矩阵来调整的,而将矩阵乘法应用到字体大小为0的结果是真正没有定义的。
您最好的选择可能是回到原来的应用程序,删除导致文本“”发出的内容。
如果由于某种原因这是不可能的,您可以利用PostScript是一种编程语言这一事实,您可以自己重新定义/ashow操作符,如果字体大小为0,则让它什么也不做,例如:
/old_ashow /ashow load def /ashow {current字体/FontMatrix获得0 eq {pop pop }{old_ashow}old_ashow}绑定def的0 1 4 {pop add}
通常,我建议将它放入一个新的文件中,并在要处理的文件(如'gs mod.ps high_resolution.ps')之前通过Ghostscript运行它,但是因为您使用的是ImagMagick,所以不能这样做。因此,如果您想要这样做,您将需要修改high_resolution.ps文件并将其放在文件的顶部。无论何时修改PostScript文件,您都必须小心使用一个编辑器,它可以处理二进制文件,并且不更改CR/LF行尾。
请注意,我不建议这样做,最好是修复生成此PostScript程序的原始文件或脚本,以便您可以在其他地方使用它(例如打印)。目前,它正在生产非法的PostScript。
至于为什么这个错误不会出现在Ghostscript的旧版本中;这几乎肯定是一个疏忽。Adobe语言参考手册列出了每个操作符可能出现的错误,但没有列出引发错误的所有可能情况。显然,这个错误条件是在7.05发布后添加的,几乎可以肯定的是,当这个问题引起开发人员的注意时。
发布于 2013-04-20 22:24:42
ashow显示文本,并为字符添加额外的空间。堆栈0 0告诉系统向字符添加零额外空间。()是要显示的文本,它似乎是一个空格,但如果没有看到二进制文件,它也可能是一个不可显示的字符。
如果该字符是未定义的特殊字符,例如制表符或null,则未定义的结果将是有意义的。只有一个1字符的字符串也可能没有意义。
如前所述,什么版本的鬼怪脚本和实际的文件将是helpful.The的死后转储并不特别有用,但是执行堆栈看起来好像有一个更复杂的上下文正在产生错误。
https://stackoverflow.com/questions/16078316
复制相似问题