我找到了一本关于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脚本中运行。 %%
建议让我克服了这个障碍。
答案 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”模式运行,该模式会禁用文件操作,并可能发出以下错误信号:invalidfileaccess
或undefinedfilename
。
另一个问题是,为什么要从 pdf 重定向输入?
另一个问题是ghostscript一次一个地处理命令行选项,所以-
指示它从stdin读取(来自pdf,因为文件重定向发生在shell之前ghostscript开始执行)在 -c "(%stdin) (r) file"
之前发生。所以它执行pdf,然后尝试打开stdin。但是当然在处理完整个pdf文件后,stdin中没有数据。因此,您还应该尝试在{/ 1}}选项之后添加-
选项。
最后,-c "whatever"
运算符仅打开文件。这就像在C中调用file
一样。它实际上并没有读取任何内容。为此,您需要使用其中一个文件读取运算符,例如fopen
,read
或readstring
。