使用stdin的简单Postscript命令失败

时间:2014-03-27 15:43:32

标签: windows-7 ghostscript postscript

我找到了一本关于PostScript的好书的指针:Thinking in Postscript

第14章 - 使用文件和输入/输出技术(第171页)中,有一个示例操作:

(%stdin) (r) file

当我在以下命令中运行它时:

gswin64c - -c "(%stdin) (r) file" < input.pdf

我收到错误输出:

Error: /undefinedfilename in --file--
Operand stack:
   (stdin)   (r)
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   
  --nostringval--   2   %stopped_push   --nostringval--
  --nostringval--   --nostringval--   false   1   %stopped_push 
  .runexec2   --nostringval--   --nostringval--   --nost
  ringval--   2   %stopped_push   --nostringval--
Dictionary stack:
   --dict:1182/1684(ro)(G)--   --dict:1/20(G)--   --dict:77/200(L)--
Current allocation mode is local
Last OS error: No such file or directory
GPL Ghostscript 9.14: Unrecoverable error, exit code 1

我做错了什么?

编辑:感谢joojaa!我在NT Batch脚本中运行。 %%建议让我克服了这个障碍。

2 个答案:

答案 0 :(得分:3)

松开第一个 - 将文件定向到ghostscript的命令流。因此,您的命令应如下所示:

gswin64c -c "(%stdin) (r) file" < input.pdf

要测试这是否有效,请使用一些文本制作文本文件,例如test.txt:

it works
line 2

并尝试:

gswin64c -q -c "(%stdin) (r) file 20 string read line pop pstack" < test.txt

应该产生:

(it works)
GS<1>

现在,如果您在批处理文件

中运行它

然后%符号需要加倍,如下所示:

gswin64c -q -c "(%%stdin) (r) file" < input.pdf

因为批处理解释器为其自己的处理保留%符号,并且转义序列为%%。

答案 1 :(得分:2)

从错误消息中,您可能忽略了 special-filename %中的(%stdin)。编辑:这个猜错了。见joojaa的回答。

您可能遇到的另一个问题是,Postcript解释程序通常以“SAFER”模式运行,该模式会禁用文件操作,并可能发出以下错误信号:invalidfileaccessundefinedfilename

另一个问题是,为什么要从 pdf 重定向输入?

另一个问题是ghostscript一次一个地处理命令行选项,所以-指示它从stdin读取(来自pdf,因为文件重定向发生在shell之前ghostscript开始执行)在 -c "(%stdin) (r) file"之前发生。所以它执行pdf,然后尝试打开stdin。但是当然在处理完整个pdf文件后,stdin中没有数据。因此,您还应该尝试在{/ 1}}选项之后添加-选项


最后,-c "whatever"运算符仅打开文件。这就像在C中调用file一样。它实际上并没有读取任何内容。为此,您需要使用其中一个文件读取运算符,例如fopenreadreadstring