Windows 7 使用stdin的简单Postscript命令失败

Windows 7 使用stdin的简单Postscript命令失败,windows-7,ghostscript,postscript,Windows 7,Ghostscript,Postscript,我找到了一本关于PostScript的好书的指针: 在第14章-使用第171页上的文件和输入/输出技术中,有一个示例操作: (%stdin) (r) file 当我在以下命令中运行该命令时: gswin64c - -c "(%stdin) (r) file" < input.pdf 我做错了什么 编辑:恭喜joojaa!我正在运行NT批处理脚本。%%的建议让我克服了这个障碍 从错误消息中,您可能忽略了特殊文件名(%stdin)中的%。编辑:这个猜测是错误的。见joojaa的答案 您可能

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

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

(%stdin) (r) file
当我在以下命令中运行该命令时:

gswin64c - -c "(%stdin) (r) file" < input.pdf
我做错了什么


编辑:恭喜joojaa!我正在运行NT批处理脚本。
%%
的建议让我克服了这个障碍

从错误消息中,您可能忽略了特殊文件名
(%stdin)
中的
%
。编辑:这个猜测是错误的。见joojaa的答案

您可能遇到的另一个问题是postscript解释器通常在禁用文件操作的“更安全”模式下运行,并且可能会发出以下错误信号:
invalidfileaccess
undefinedfilename

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

另一个问题是ghostscript一次处理一个命令行选项,因此引导它从stdin(来自pdf,因为文件重定向在ghostscript开始执行之前发生在shell中)读取的
-
发生在
-c”(%stdin)(r)file“
之前。因此它执行pdf,然后尝试打开stdin。当然,在stdin处理完整个pdf文件后,里面就没有数据了。因此,您还应该尝试将
-
选项放在
-c“whatever”
选项之后



最后,
文件
操作符只打开文件。这就像在C中调用
fopen
,实际上它什么都不读。为此,您需要从错误消息中使用一个文件读取操作符,如
read
readstring
、或
readline

,看起来您可能从特殊文件名
(%stdin)
中省略了
%
。编辑:这个猜测是错误的。见joojaa的答案

您可能遇到的另一个问题是postscript解释器通常在禁用文件操作的“更安全”模式下运行,并且可能会发出以下错误信号:
invalidfileaccess
undefinedfilename

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

另一个问题是ghostscript一次处理一个命令行选项,因此引导它从stdin(来自pdf,因为文件重定向在ghostscript开始执行之前发生在shell中)读取的
-
发生在
-c”(%stdin)(r)file“
之前。因此它执行pdf,然后尝试打开stdin。当然,在stdin处理完整个pdf文件后,里面就没有数据了。因此,您还应该尝试将
-
选项放在
-c“whatever”
选项之后



最后,
文件
操作符只打开文件。这就像在C中调用
fopen
,实际上它什么都不读。为此,您需要使用其中一个文件读取操作符,如
read
readstring
、或
readline

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

gswin64c -c "(%stdin) (r) file" < input.pdf
并尝试:

gswin64c -q -c "(%stdin) (r) file 20 string read line pop pstack" < test.txt
gswin64c-q-c“(%stdin)(r)文件20字符串读取行pop pstack”
应产生:

(it works)
GS<1>
(它可以工作)
GS
现在,如果在批处理文件中运行这个 然后%符号需要加倍,如下所示:

gswin64c -q -c "(%%stdin) (r) file" < input.pdf
gswin64c-q-c“(%stdin)(r)文件”

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

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

gswin64c -c "(%stdin) (r) file" < input.pdf
并尝试:

gswin64c -q -c "(%stdin) (r) file 20 string read line pop pstack" < test.txt
gswin64c-q-c“(%stdin)(r)文件20字符串读取行pop pstack”
应产生:

(it works)
GS<1>
(它可以工作)
GS
现在,如果在批处理文件中运行这个 然后%符号需要加倍,如下所示:

gswin64c -q -c "(%%stdin) (r) file" < input.pdf
gswin64c-q-c“(%stdin)(r)文件”

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

LOL你比我快。看起来我们的两个答案提供了补充信息。我不认为这是个问题。:)我正在传递一个PDF文件,因为我正在使用它。如果没有
-c
选项,ghostscript似乎可以很好地呈现PDF。我知道
文件
只是打开了一个手柄,但我选择了最小的故障单元。相信我,我还有很多其他的失败可挑!至于在
-
之前或之后,我已经尝试了这两种方法,但如果无法将
%stdin
重置为0位置,可能两种方法都不起作用。哈哈,你比我快了。看起来我们的两个答案提供了补充信息。我不认为这是个问题。:)我正在传递一个PDF文件,因为我正在使用它。如果没有
-c
选项,ghostscript似乎可以很好地呈现PDF。我知道
文件
只是打开了一个手柄,但我选择了最小的故障单元。相信我,我还有很多其他的失败可挑!至于在
-
之前或之后,我已经尝试了这两种方法,但如果无法将
%stdin
重置为0位置,这两种方法似乎都不起作用。太好了!!将
%%
的值加倍可以完全消除错误。注意:I get Error:/typecheck-in--read--running您的示例。我正在将内存中的PDF二进制文件渲染为位图,现在需要读取元数据(关键字、作者等)。我希望在没有文件I/O的情况下完成这项工作,并且不想调用解释器两次,或者更糟糕的是,使用两个不同的库来完成这项工作。不用说,一旦我开始直接执行postscript命令,事情就开始分崩离析了。我不确定这对您是否重要,但我能够通过将文档包装在一组PDF命令中(基本上将整个文件嵌入到命令str中)来规避使用
stdin时遇到的所有问题