我希望使用Ghostscript 9.15将任意PDF文件转换为PDF / A.
Ghostscript是否能够创建符合PDF / A-3b标准的PDF?没有表示PDF / A一致性级别的参数,因此我假设没有可能性。还是有什么我忽略的?
我正在关注一篇博客文章,其中使用Windows批处理文件将PDF转换为PDF / A(请参阅http://www.mcbsys.com/techblog/2013/04/batch-convert-pdf-to-pdfa/)。批处理中的gs
调用是:
"%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
因此,我使用 AdobeRGB1998.icc ,这显然可用于具有RGB色彩空间的PDF文件。根据{{1}}值(DEVICERGB),打印出正确的值。
转换适用于所有文件。但是当我根据PDF / A-1b验证创建的PDF文件时,根据输入文件是否具有RGB颜色空间(例如CMYK),我会得到不同的结果。因此,当我有一个使用CMYK颜色空间的输入PDF文件时,该文件由脚本转换,但验证器说的是这样的:
-sProcessColorModel
我的问题:有没有办法让任意文件完成转换(即独立于输入文件中使用的颜色空间)?
更新
@KenS感谢您的回答。我已经更新了我的初始帖子,以澄清我想要实现的目标。
为了使其更明确,我将使用一个例子。有两个文件: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
(似乎使用RGB)和input1.pdf
(似乎使用CMYK)。我想将它们都转换为PDF / A-1。感谢您的提示,我已经放弃了上面提到的批处理脚本,而是直接在命令行中测试了该命令。阅读Ps2pdf.htm#PDFA后,我调整了(官方) PDFA_def.ps ,以便使用 AdobeRGB1998.icc 。然后我在两个输入文件上调用了以下命令(由 output2.pdf 替换 output1.pdf ,用 input2替换 input1.pdf 。 pdf 为第二个文件):
input2.pdf
转换完成没有任何错误。 output1.pdf似乎有效,但output2.pdf仍然无效(使用3heights Validator进行测试):
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
因此,当我正确理解您的答案时,上面的命令应该生成一个使用RGB颜色空间的pdf文件 - 与输入文件的颜色空间无关。如果输入文件使用CMYK,则必须使用上述命令将颜色转换为RGB。
当我正确解释第一个错误消息时,output2.pdf中使用的颜色空间仍然是CMYK(尽管命令参数如ColorConversionStrategy = / RGB)。由于我使用的是AdobeRGB1998.icc,因此会出现验证错误。
上述命令中缺少什么?
回到我原来的问题(更进一步):我不想总是转换为RGB(或CMYK),而是想以某种方式检测输入文件中使用的颜色空间,然后动态切换到RGB或CMYK icc文件。是否有可能实现这一目标?
答案 0 :(得分:1)
Ghostscript不支持PDF / A-3。您要查找的一致性参数是-dPDFA =其中有效值为空(默认为1),1或2.您可以在ghostpdl / gs / doc / ps2pdf / htm#PDFA中找到此文件
我不确定你在这里要求的是什么。您必须创建一个PDF / A文件(无论如何,我还没有阅读第3版或第2版),这是RGB或CMYK,因为您不能同时使用它们(您可以将所有内容转换为设备)当然是独立的颜色)。除了决定是否需要转换之外,输入中使用的颜色空间不相关。
这是你需要决定的事情,我们无法为你决定。一个重要原因是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配置文件以便在它们之间进行选择)。我们从来没有客户要求这样做,因此我们不太可能将其作为一个项目。当然,如果你确实如此工作,我们可以很好地将它合并到代码库中,如果你要将它提供给我们。