在postscript文件中打开失败

时间:2014-03-10 17:39:26

标签: postscript eps

执行以下代码

%!PS-Adobe-2.0
%
/bdf { bind def } bind def  
/ldf { load def } bdf 
%
/cm  { 28.3464566929134 mul } bdf 
/icm { 28.3464566929134 div } bdf
%
/Helvetica findfont 20 scalefont setfont
%
/filespec (C:\\test1\\test2\\test3\\logo.eps) def
%
filespec status
{
    4{pop}repeat (EXISTS! \n) print
    gsave
        2.0 cm 25.0 cm translate
        0 0 moveto
        {filespec (r) file}stopped{
            (UPS!? DOES NOT EXIT! \n)print
        }{
            dup cvx exec
            closefile
        }ifelse
    grestore
}{
    (DOES NOT EXIT! \n)print
}ifelse
stroke
showpage

我接受了这个:

GPL Ghostscript 9.06 (2012-08-08)
Copyright (C) 2012 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Displaying non DSC file C:/__EDB__/test/zwi.ps
Loading NimbusSanL-Regu font from %rom%Resource/Font/NimbusSanL-Regu... 3486280 2151039 3424632 2124503 2 done.

EXITS! 

UPS!? DOES NOT EXIT!?

好的,我做了一些更深入的调查:

使用“ GSview 5.0 2012-01-17 ”它失败了(双击zwi.ps)。

使用“ GPL Ghostscript 9.06(2012-08-08) ”是可以的;我得到了我的徽标(命令行)。

我正在使用64位Windows 7。

感谢所有人。

2 个答案:

答案 0 :(得分:1)

我假设这是因为文件规范使用Windows,但Ghostscript不需要-dNOSAFER,除非在非常特殊的情况下。

NOSAFER只是阻止了SAFER的应用,NOSAFER旨在用于Ghostscript自己的启动例程,以允许它访问自己的文件(否则无法启动)。一般来说,你永远不应该使用NOSAFER。

我不明白为什么你的反向通道输出不与其他Ghostscript输出内联,你是从命令行还是从应用程序内部执行Ghostscript?

真正的问题是因为'file'返回错误,所以假设文件不存在。这是荒谬的。该文件可能存在,但权限可能会阻止Ghostscript打开文件进行读取。该文件可能具有阻止此操作的权限,或者可能是操作系统文件,或者该文件可能在另一个拒绝共享的应用程序中打开。

您可以使用上面的luser droog提供的代码来显示发生了哪个错误,或者只是在停止的上下文中不执行'file',以便恢复错误。而不是'undefinedfilename'(由文件不存在引起),我希望你会得到'invalidfileaccess'。

请注意,如果文件不存在,则PostScript程序会出错:

filespec status
{
...
}{
    pop
    (DOES NOT EXIT! \n)print
}ifelse

如果文件不存在,则status在堆栈上返回一个布尔值,值为'false',由ifelse使用。这意味着堆栈为空,当'else'子句执行'pop'时,您将收到stackunderflow错误。

答案 1 :(得分:0)

您可能需要为ghostscript指定选项-dNOSAFER以启用文件操作。

为了支持在您的计算机上运行postcript文档(尽管它是代码)是“安全”的概念,许多解释器隐式禁止对OS文件执行所有操作(包含该程序的currentfile除外)流,%stdin%stdout%stderr

您可以(我认为)通过检查status是否引发错误来验证是否存在这种情况。

请将您的电话打包到status

{ status } stopped { (status threw ) print $error /errorname get =} if