代码之家  ›  专栏  ›  技术社区  ›  user645280

使用stdin的简单Postscript命令失败

  •  1
  • user645280  · 技术社区  · 10 年前

    我找到了一本关于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批处理脚本中运行。这个 %% 这个建议使我克服了这个障碍。

    2 回复  |  直到 10 年前
        1
  •  3
  •   joojaa    10 年前

    松开第一个-这会将文件引导到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
    

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

        2
  •  2
  •   luser droog    10 年前

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

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

    另一个问题是,为什么要重定向来自 pdf格式 ?

    另一个问题是ghostscript一次处理一个命令行选项,因此 - 引导它从stdin读取(它来自pdf,因为文件重定向在ghostscript开始执行之前发生在shell中) 之前 -c "(%stdin) (r) file" 。所以它执行pdf,然后尝试打开stdin。但是,在stdin处理完整个pdf文件后,它当然没有数据了。所以你也应该试着把 - 选项 之后 这个 -c "whatever" 选项


    最后 file 仅操作员 打开 文件。就像打电话 fopen 它实际上什么都不会读。为此,您需要使用一个文件读取运算符,如 read , readstring readline .