【问题标题】:ghostscript converting to pdf-a - icc file correct?ghostscript 转换为 pdf-a - icc 文件是否正确?
【发布时间】:2016-11-17 15:22:44
【问题描述】:

我在 Windows 系统上使用 ghostscript 9.19。 当我从批处理文件运行 ghostscript 时,它会创建 pdf。 当从程序安排ghostscript时,它会创建一个没有内容的pdf - 只有一个空白页。 两种情况下的命令行都是一样的(一行很长,下面因为格式化分开了):

gswin32c.exe  -sstdout=d:\my_data\gs_stdout.log  
        -dPDFA=1 -dBATCH -dNOPAUSE -dNOOUTERSAVE 
        -sColorConversionStrategy=/RGB 
        -sOutputICCProfile=d:\my_ps_files\AdobeRGB1998.icc 
        -sDEVICE=pdfwrite 
        -sOutputFile=d:\my_data\my_hopeful_pdfa_pdfa.pdf 
        -dPDFACompatibilityPolicy=1 "d:\my_ps_files/PDFA_def.ps" "d:\my_data\my_hopeful_pdfa_pdfa.ps" 
        > d:\my_data\my_hopeful_pdfa_gs_out.log 

my_hopefule_pdfa_gs_out.log 永远不会被创建。但是 gs_stdout.log 确实被创建了。

是否创建 pdf 似乎与运行 ghostscript 的目录中是否存在 *.icc 文件有关。

我在 stdout.log 文件中得到不同的输出。

当它起作用时,我得到:

GPL Ghostscript 9.19 (2016-03-23)
Copyright (C) 2016 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Error: /undefinedfilename in (>)
Operand stack:
   false
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push
Dictionary stack:
   --dict:1201/1684(ro)(G)--   --dict:0/20(G)--   --dict:80/200(L)--
Current allocation mode is local
Last OS error: Invalid argument

失败时的错误日志是:

GPL Ghostscript 9.19 (2016-03-23)
Copyright (C) 2016 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Error: /undefinedfilename in --file--
Operand stack:
   --nostringval--   --nostringval--   (AdobeRGB1998.icc)   (r)
Execution stack:
%interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   1967   1   3   %oparray_pop   1966   1   3   %oparray_pop   1950   1   3   %oparray_pop   1836   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2   --nostringval--   --nostringval--       --nostringval--   2   %stopped_push   --nostringval--
Dictionary stack:
   --dict:1201/1684(ro)(G)--   --dict:0/20(G)--   --dict:79/200(L)--
Current allocation mode is local
Last OS error: No such file or directory
Current file position is 818

谁能帮我解释一下这个输出。 AdobeRGB1988.icc 在这两种情况下都驻留在命令行中指定的 d:\my_ps_files\AdobeRGB1998.icc 中。

【问题讨论】:

  • 您在/PDFA_def.ps 处使用正斜杠,这不是普通的 Windows 路径分隔符。尝试用反斜杠替换它。另一点是,从程序启动时环境变量可能会有所不同,但不知道哪个程序以何种方式启动它,这很难说。

标签: pdf ghostscript


【解决方案1】:

正斜杠无关紧要,Ghostscript 可以处理任何一种类型,或在同一路径中处理两种类型,就像这里一样(尽管我同意至少坚持其中一种是明智的)。

实际的问题是它找不到文件“AdobeRGB1998.icc”(在 PostScript 中 undefinedfilename 意味着解释器找不到文件)并且没有看到 PDFA_def.ps 文件的内容就不可能确切地说出原因(因为文件是在 PDFA_def.ps 中打开的)

然而,一个合理的猜测是,在一种情况下,您正在从文件夹 d:\my_ps_files 执行 Ghostscript,因此 ICC 配置文件位于当前目录中,而在另一种情况下,您正在从“其他”执行 Ghostscript目录,所以文件不在当前目录中。显然你修改了那里的文件名,因为这不是默认名称,但看起来你没有指定完整的路径。

'as specified in the command line' 指的是完全不同的调用,在这种情况下,您使用 Adob​​eRGB1998.icc 作为 OutputICCProfile,但是 PDFA_def.ps 需要使用它来设置 OutputIntent 字典中的 DestOutptuProfile,这完全是另一回事,在命令行中没有指定。这是因为没有办法在命令行上创建字典对象,所以它必须在 PostScript 中完成,而且由于字典的创建必须在 PostScript 中完成,所以它的内容的创建也是如此,其中之一是 DestOutputProfile,由于它是从文件中读取的,因此您也需要在 PostScript 中指定它。

您应该在 PDFA_def.ps 中放置 ICC 配置文件的完整路径规范,而不是将其隐含地保留为当前工作目录。

请注意,DestOutputProfile 和 OutputICCProfile 是不同的东西,您确实不需要需要为高级输出指定 OutputICCProfile,这是一个用于渲染的控件,它在这里不起作用,我会放弃它。

你的批处理文件中出现错误的原因是'>'是一个shell命令,所以如果你把它放在一个批处理文件中它不会工作,它将作为命令行传递给Ghostscript争论。幸运的是,这发生在处理完成后,因此没有不良影响。无论如何,它不会包含任何内容,因为您已将标准输出重定向到文件。

不要设置 -dNOOUTERSAVE 除非你有充分的理由,而不仅仅是民间传说(设置它有充分的理由,但你似乎没有以这种方式使用它)。除非适用某些特定条件,否则这只会降低处理速度(由于与垃圾收集相关的复杂原因)。

【讨论】:

  • 我将此设置为答案。在 PDFA_def.ps 中设置完整路径可以使事情正常进行。删除 -dNOOUTERSAVE 对性能产生了影响。你知道你的东西。您是从艰辛的经历中学到的,还是您手头上有特定的参考资料(互联网查询除外)?
  • 经验,我猜,我是Ghostscript开发团队的一员(嘘,不要让所有人都知道... ;-)
  • 如果我没有在PDFA_def.PS中设置完整路径,Ghostscript会搜索path环境变量中的所有路径吗?
  • 什么的完整路径?无论如何,Ghostscript 不使用 $PATH,所以没有。
猜你喜欢
  • 2014-11-20
  • 2016-06-15
  • 2020-07-13
  • 2020-03-07
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 2022-01-19
  • 2023-04-08
相关资源
最近更新 更多