2016-11-17 135 views
1

我在Windows系统上使用ghostscript 9.19。 当我从批处理文件运行ghostscript时,它创建pdf。 当ghostscript从程序计划时,它会创建一个没有内容的pdf - 只有一个空白页面。 的命令行是在两种情况下是相同的(一个龙线,下面分裂由于格式化):从未被创建ghostscript转换为pdf-a-icc文件是否正确?

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格式被创建似乎关系到* .icc文件是否不存在的目录中ghostscript的运行。

我得到的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 \ Adob​​eRGB1998.icc作为在命令行指定。

+0

您在'/ PDFA_def.ps'处使用正斜杠,该斜杠不是正常的Windows路径分隔符。尝试用反斜杠代替它。另一点是,从程序启动时,环境变量可能会有所不同,但不知道程序以什么方式启动它,这很难说。 –

回答

2

正斜杠是无关的,可以的Ghostscript在相同的方式来处理两种类型,或两者兼而有之,如在这里(虽然我同意这样做至少是明智的坚持一个或其他)。

实际的问题是,它找不到文件'AdobeRGB1998.icc'(在PostScript中的undefinedfilename意味着解释器找不到文件),并且没有看到PDFA_def.ps文件的内容,它不可能说明为什么(因为该文件在PDFA_def.ps中打开)

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

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

你应该把完整的路径规范的ICC配置文件中PDFA_def.ps,而不是仅仅把它当作隐含的当前工作目录。

注意,DestOutputProfile和OutputICCProfile是不同的东西,你不需要指定为高电平输出一个OutputICCProfile,这对渲染控制,在这里有没有影响,我会放弃它。

你在批处理文件中出现错误的原因是'>'是一个shell命令,所以如果你把它放在一个批处理文件中,它将不起作用,它会作为命令传递给Ghostscript在线参数。幸运的是,处理完成后会发生这种情况,所以它没有不良影响。它不会包含任何东西,因为你已经将stdout重定向到一个文件。

不要设置-dNOOUTERSAVE,除非你有一个很好的理由,而不是简单的民间传说(有一个很好的理由来设置它,但你似乎没有以这种方式使用它)。除非某些特定条件适用,否则这只会造成处理速度减慢(与垃圾收集相关的复杂原因)。

+0

我将此设置为答案。在PDFA_def.ps中设置完整路径得到了工作。删除-dNOOUTERSAVE在性能上有所不同。你知道你的东西。您是从经验的艰辛之路中学习的吗?还是您有一个具体的参考资料(除了Internet查询)? – infowanna

+0

经验,我想我是Ghostscript开发团队之一(嘘,别让大家知道...... ;-) – KenS

+0

如果我没有在PDFA_def.PS中设置完整路径,那么Ghostscript会通过全部搜索路径中的路径环境变量? – infowanna