2014-09-25 69 views
2

我想用Ghostscript 9.15将任意PDF文件转换为PDF/A。通过Ghostscript将PDF文件转换为PDF/A

  1. Ghostscript能够创建符合PDF/A-3b标准的PDF文件吗?没有表示PDF/A一致性级别的参数,所以我认为不可能。还是有什么我忽略了?

  2. 我正在关注一篇博客文章,其中使用Windows批处理文件将PDF转换为PDF/A(请参阅http://www.mcbsys.com/techblog/2013/04/batch-convert-pdf-to-pdfa/)。该gs invokation在批次:

    "%gs_path%\gswin64c"^
    -dPDFA^
    -dNOOUTERSAVE^
    -sProcessColorModel=DeviceRGB^
    -sDEVICE=pdfwrite^
    -o "GS_%file1%"^
    -dPDFACompatibilityPolicy=1^
        "%currentdir%\PDFA_def.ps"^
        %inputfilelist% 
    

PDFA_def.ps是一个官方的调整版本:

%! 
% This prefix file for creating a PDF/A document is derived from 
% the sample included with Ghostscript 9.07, released under the 
% GNU Affero General Public License. 
% Modified 4/15/2013 by MCB Systems. 

% Feel free to modify entries marked with "Customize". 

% This assumes an ICC profile to reside in the file (AdobeRGB1998.icc), 
% unless the user modifies the corresponding line below. 

% The color space described by the ICC profile must correspond to the 
% ProcessColorModel specified when using this prefix file (GRAY with 
% DeviceGray, RGB with DeviceRGB, and CMYK with DeviceCMYK). 

% Define entries in the document Info dictionary : 

/ICCProfile (... PATH TO ... AdobeRGB1998.icc) % Customize. 
def 

[ /Title (Title)     % Customize. 
    /DOCINFO pdfmark 

% Define an ICC profile : 

[/_objdef {icc_PDFA} /type /stream /OBJ pdfmark 
[{icc_PDFA} <</N systemdict /ProcessColorModel get /DeviceGray eq {1} {systemdict /ProcessColorModel get /DeviceRGB eq {3} {4} ifelse} ifelse >> /PUT pdfmark 
[{icc_PDFA} ICCProfile (r) file /PUT pdfmark 

% Define the output intent dictionary : 

[/_objdef {OutputIntent_PDFA} /type /dict /OBJ pdfmark 
[{OutputIntent_PDFA} << 
    /Type /OutputIntent    % Must be so (the standard requires). 
    /S /GTS_PDFA1     % Must be so (the standard requires). 
    /DestOutputProfile {icc_PDFA}   % Must be so (see above). 
    /OutputConditionIdentifier (AdobeRGB1998)  % Customize 
>> /PUT pdfmark 
[{Catalog} <</OutputIntents [ {OutputIntent_PDFA} ]>> /PUT pdfmark 

所以,我用Adob​​eRGB1998.icc这显然是可用于具有RGB色彩空间的PDF文件。根据-sProcessColorModel值(DEVICERGB),打印出一个正确的值。

该转换适用于所有文件。但是,当我根据PDF/A-1b验证创建的PDF文件时,根据输入文件是否具有RGB色彩空间(例如CMYK),我得到了不同的结果。所以,当我有一个使用CMYK色彩空间的输入PDF文件,该文件被由脚本转换,但验证说是这样的:

input.pdf", 1, 38, 0x03418614, "A device-specific color space (DeviceCMYK) without an appropriate output intent is used.", 1 
"output.pdf", 20, 0, 0x83410612, "The document does not conform to the requested standard.", 1 

我的问题:有没有办法让转换完成对于任意文件(即独立于输入文件中使用的颜色空间)?


更新

@KenS谢谢您的回答。我已经更新了我的初始帖子,以澄清我想实现的目标。

为了使它更加明确,我将使用一个例子。有两个文件:input1.pdf(似乎使用RGB)和input2.pdf(似乎使用CMYK)。我想将它们都转换为PDF/A-1。感谢您的提示,我放弃了上面提到的批处理脚本,而是直接在命令行中测试命令。在阅读Ps2pdf.htm#PDFA后,我调整了(官方)PDFA_def.ps以便使用Adob​​eRGB1998.icc。然后I(由input2.pdf取代output1.pdf通过output2.pdfinput1.pdf用于第二文件)调用在两个输入文件的以下命令:

gswin64c.exe -dPDFA=1 -dBATCH -dNOPAUSE -dNOOUTERSAVE \ 
      -sColorConversionStrategy=/RGB \ 
      -sOutputICCProfile=AdobeRGB1998.icc -sDEVICE=pdfwrite \ 
      -sOutputFile=output1.pdf -dPDFACompatibilityPolicy=1 \ 
       "PATH/TO/OFFICIAL/PDFA_def.ps" input1.pdf 

转换完成没有任何错误。该output1.pdf似乎是有效的,但output2.pdf仍然是无效的(与3heights验证测试):

"output2.pdf", 1, 40, 0x03418614, "A device-specific color space (DeviceCMYK) without an appropriate output intent is used.", 1 
"output2.pdf", 20, 0, 0x83410612, "The document does not conform to the requested standard.", 1 

所以,当我正确地理解你的答案,上面的命令应该产生它使用一个PDF文件RGB色彩空间 - 与输入文件的色彩空间无关。如果输入文件使用CMYK,则必须使用上述命令将颜色转换为RGB。

当我正确解释第一条错误消息时,output2.pdf中使用的颜色空间仍然是CMYK(尽管命令参数如ColorConversionStrategy =/RGB)。由于我使用了AdobeRGB1998.icc,因此出现验证错误。

我在上面的命令中缺少了什么?回到我原来的问题(这是更进一步):我不想总是转换为RGB(或CMYK),而是想以某种方式检测输入文件中使用哪种颜色空间,然后动态切换为RGB或CMYK icc文件。这有可能实现吗?

回答

1

Ghostscript不支持PDF/A-3。您正在查找的一致性参数是-dPDFA =其中有效值为空(默认值为1),1或2.您可以在ghostpdl/gs/doc/ps2pdf/htm#PDFA

不知道你在这里要求什么。您必须创建一个PDF/A文件(无论如何,我还没有阅读第3版规范),因为您不允许同时使用这两个文件(您可以将所有内容都转换为设备独立的颜色当然)。输入中使用的颜色空间是不相关的,除了决定是否需要转换之外。

这是你需要决定的事情,我们不能为你决定。一个重要原因是OutputIntent 必须必须与 RGB或CMYK一致,并且pdfwrite设备不检查它,它假定您选择了一个与您用于PDF文件的设备空间匹配的设备空间(由方法,不要设置ProcessColorModel,而是使用ColorConversionStrategy)在您的情况下,您已将OutputIntent设置为AdobeRGB1988,因此您的颜色必须必须以与设备无关的颜色或RGB指定。

鉴于您引用的错误,我建议问题是您没有指定-sColorConversionStrategy,因此输入颜色未被转换为所需的设备空间。我会进一步猜测你从set -dUseCIEColor复制了这个脚本,并且你没有复制那个位。不要设置-dUseCIEColor,它是一个古怪的PostScript hackery。而是设置ColorConversionStrategy,它可以根据需要以更好的方式转换颜色。

更新答案,因为这开始变得太长评论:

我不能立即看到您的命令行中的任何问题,你可以分享一个例子PDF文件?用一个可靠的例子来研究这些事情更容易。我从客户和其他免费用户那里得知,pdfwrite能够生成符合要求的PDF/A-1b文件。

关于第二个问题;它不可能这样做,因为目前您需要在开始之前将OutputIntentProfile设置为CMYK或RGB。您不能直接在输入PDF文件中运行,直到进入颜色操作,然后再决定。如果您觉得有些编程可以通过修改pdfwrite来完成,因为配置文件在输出关闭之前不会实际使用。

一个问题是,为了进行颜色转换,您需要设置基础ProcessColorModel(ColorConversionStategy会自动完成此操作)。更改ProcessColorModel的唯一方法是执行setpagedevice,这会导致擦除页面。现在我认为它实际上是可以用pdfwrite修复的,它所做的只是在页面上写一个白色的矩形,所以你应该能够拦截它并且不会发出它。否则,您在遇到RGB或CMYK操作之前所做的任何标记都将位于白色矩形的下方.....

因此,基本上不行,您现在无法做到,如果它对您很重要,那么您可能修改代码(不要忘记您还需要提供2个OutputIntent配置文件以供选择)。我们从来没有客户要求这样做,所以我们不可能把它作为一个项目。当然,如果你确实得到了这个工作,我们可能会很好地将它合并到代码库中,如果你想把它提供给我们。

+0

我也更新了我的答案,它不适合评论。 – KenS 2014-09-26 07:15:59

+0

关于示例文件:有一个巴伐利亚州试用版,其中有许多pdf文件。您可以在这里下载所有文件:http://www.pdflib.com/fileadmin/pdflib/Bavaria/2009-04-03-Bavaria-pdfa.zip我测试的文件是“conforming \ Real world \ jmbl-2009-01 .PDF”。提前致谢! – codingAL 2014-09-26 07:31:47

+0

这是一个40Mb的下载,只有一个文件,你可能会发现一个更小,可用的文件隔离? – KenS 2014-09-26 08:29:35

相关问题