ghostscript 转换为 pdf-a - icc 文件是否正确?
ghostscript converting to pdf-a - icc file correct?
我在 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 似乎与 *.icc 文件是否存在于 ghostscript 运行s 所在的目录中有关。
我在 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 中,如命令行中指定的那样。
正斜杠无关紧要,Ghostscript 可以在同一路径中处理其中一种类型,或同时处理两种类型,如此处所示(尽管我同意坚持其中一种至少是明智的)。
实际问题是它找不到文件 'AdobeRGB1998.icc'(在 PostScript 中 undefinedfilename 意味着解释器找不到文件)并且没有看到 PDFA_def.ps 文件的内容是不可能的说出具体原因(因为文件是在 PDFA_def.ps 中打开的)
然而,一个合理的猜测是,在一种情况下,您正在从文件夹 d:\my_ps_files 执行 Ghostscript,因此 ICC 配置文件位于当前目录中,而在另一种情况下,您正在执行来自 'some other' 目录的 Ghostscript,因此该文件不在当前目录中。显然您修改了其中的文件名,因为这不是默认名称,但看起来您没有指定完整路径。
'as specified in the command line'指的是完全不同的调用,在本例中您使用AdobeRGB1998.icc作为OutputICCProfile,然而,PDFA_def.ps需要使用它来设置DestOutptuProfile OutputIntent 字典,这是完全不同的东西,在命令行上指定 not。这是因为没有办法在命令行上创建字典对象,所以它必须在 PostScript 中完成,并且由于字典的创建必须在 PostScript 中完成,所以它的内容的创建也是如此,其中之一是 DestOutputProfile,因为它是从文件中读取的,所以您也需要在 PostScript 中指定它。
您应该在 PDFA_def.ps 中放置 ICC 配置文件的完整路径规范,而不是将其隐式保留为当前工作目录。
注意DestOutputProfile和OutputICCProfile是不同的东西,你不需要需要为高级输出指定一个OutputICCProfile,那是渲染的控件,它在这里没有作用我会放弃它。
你在批处理文件中出现错误的原因是因为'>'是一个shell命令,所以如果你把它放在批处理文件中它不会工作,它会被传递到 Ghostscript 作为命令行参数。幸运的是,这发生在处理完成之后,因此没有不良影响。它无论如何都不会包含任何内容,因为您已将标准输出重定向到文件。
不要设置 -dNOOUTERSAVE 除非你有充分的理由,而不仅仅是民间传说(设置它有一个很好的理由,但你似乎没有那样使用它)。除非某些特定条件适用,否则这只会减慢处理速度(出于与垃圾收集相关的复杂原因)。
我在 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 似乎与 *.icc 文件是否存在于 ghostscript 运行s 所在的目录中有关。
我在 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 中,如命令行中指定的那样。
正斜杠无关紧要,Ghostscript 可以在同一路径中处理其中一种类型,或同时处理两种类型,如此处所示(尽管我同意坚持其中一种至少是明智的)。
实际问题是它找不到文件 'AdobeRGB1998.icc'(在 PostScript 中 undefinedfilename 意味着解释器找不到文件)并且没有看到 PDFA_def.ps 文件的内容是不可能的说出具体原因(因为文件是在 PDFA_def.ps 中打开的)
然而,一个合理的猜测是,在一种情况下,您正在从文件夹 d:\my_ps_files 执行 Ghostscript,因此 ICC 配置文件位于当前目录中,而在另一种情况下,您正在执行来自 'some other' 目录的 Ghostscript,因此该文件不在当前目录中。显然您修改了其中的文件名,因为这不是默认名称,但看起来您没有指定完整路径。
'as specified in the command line'指的是完全不同的调用,在本例中您使用AdobeRGB1998.icc作为OutputICCProfile,然而,PDFA_def.ps需要使用它来设置DestOutptuProfile OutputIntent 字典,这是完全不同的东西,在命令行上指定 not。这是因为没有办法在命令行上创建字典对象,所以它必须在 PostScript 中完成,并且由于字典的创建必须在 PostScript 中完成,所以它的内容的创建也是如此,其中之一是 DestOutputProfile,因为它是从文件中读取的,所以您也需要在 PostScript 中指定它。
您应该在 PDFA_def.ps 中放置 ICC 配置文件的完整路径规范,而不是将其隐式保留为当前工作目录。
注意DestOutputProfile和OutputICCProfile是不同的东西,你不需要需要为高级输出指定一个OutputICCProfile,那是渲染的控件,它在这里没有作用我会放弃它。
你在批处理文件中出现错误的原因是因为'>'是一个shell命令,所以如果你把它放在批处理文件中它不会工作,它会被传递到 Ghostscript 作为命令行参数。幸运的是,这发生在处理完成之后,因此没有不良影响。它无论如何都不会包含任何内容,因为您已将标准输出重定向到文件。
不要设置 -dNOOUTERSAVE 除非你有充分的理由,而不仅仅是民间传说(设置它有一个很好的理由,但你似乎没有那样使用它)。除非某些特定条件适用,否则这只会减慢处理速度(出于与垃圾收集相关的复杂原因)。