使用 Ghostscript 将 PDF 转换为 PDF/X1a 时透明度丢失

Posted

技术标签:

【中文标题】使用 Ghostscript 将 PDF 转换为 PDF/X1a 时透明度丢失【英文标题】:Transparency lost when converting PDF to PDF/X1a with Ghostscript 【发布时间】:2015-07-09 08:08:58 【问题描述】:

我们需要将使用 ApacheFOP 创建并与pdftk 合并的 PDF 转换为 PDF/X-1a。我已经创建了一个PDFX_def.ps,内容如下:

%!
% This is a sample prefix file for creating a PDF/X-3 document.
% Feel free to modify entries marked with "Customize".
% This assumes an ICC profile to reside in the file (ISO Coated sb.icc),
% unless the user modifies the corresponding line below.
systemdict /ProcessColorModel known 
systemdict /ProcessColorModel get dup /DeviceGray ne exch /DeviceCMYK ne and
 
true
 ifelse
 (ERROR: ProcessColorModel must be /DeviceGray or DeviceCMYK.)=
/ProcessColorModel cvx /rangecheck signalerror
 if
% Define entries to the document Info dictionary :
[ /GTS_PDFXVersion (PDF/X-1:2001) % Must be so (the standard requires).
/GTS_PDFXConformance (PDF/X-1a:2001)
/Title (Title) % Customize.
/Trapped /False % Must be so (Ghostscript doesn't provide other).
/DOCINFO pdfmark
% Define an ICC profile :
/ICCProfile (/var/www/share/data/files/sRGB_IEC61966-2-1_black_scaled.icc) def % Customize or remove.
currentdict /ICCProfile known 
[/_objdef icc_PDFX /type /stream /OBJ pdfmark
[icc_PDFX <</N>> /PUT pdfmark
[icc_PDFX ICCProfile (r) file /PUT pdfmark if
%Define the output intent dictionary :
[/_objdef OutputIntent_PDFX /type /dict /OBJ pdfmark
[OutputIntent_PDFX <<
/Type /OutputIntent % Must be so (the standard requires).
/S /GTS_PDFX % Must be so (the standard requires).
/OutputCondition (Commercial and specialty printing) % Customize
/Info (none) % Customize
/OutputConditionIdentifier (CGATS TR001) % Customize
/RegistryName (http://www.color.org) % Must be so (the standard requires).
currentdict /ICCProfile known 
/DestOutputProfile icc_PDFX % Must be so (see above).
 if
>> /PUT pdfmark
[Catalog <</OutputIntents [ OutputIntent_PDFX ]>> /PUT pdfmark

然后我在下面的命令中使用这个文件:

gs -dPDFX -dBATCH -dNOPAUSE -dNOOUTERSAVE -dUseCIEColor \
   -sProcessColorModel=DeviceCMYK -sDEVICE=pdfwrite \
   -sOutputFile=output-x1a.pdf PDFX_def.ps output.pdf

我使用的是 Ghostscript 9.05,这里是原始文件和生成的 PDF 的链接:

http://content.kartenmacherei.de/original.pdf http://content.kartenmacherei.de/pdfx1a_example.pdf

正如您在 PDF 文件中看到的那样,图像周围的透明度丢失了。你知道如何解决吗?还是使用 Debian 从原始文件创建 PDF/X1a 文件的更好方法?

【问题讨论】:

一个更好的问题标题是“转换时图像的透明度丢失......” 【参考方案1】:

您无法使用 Ghostscript 可靠地创建 PDF/X1-a PDF 文件。 PDF/X-1a 格式限制色彩空间的方式是旧版本的 pdfwrite 设备不支持,而新版本不支持。

PDF/X1-a 不支持透明度,因此无论如何您都无法生成具有透明度的 PDF/X-1a 文件,如果您使用 Ghostscript 尝试此操作,它只会创建一个包含大位图图像的 PDF 文件.

您还应该使用更新版本的 Ghostscript,尽管这无论如何都不允许您创建 PDF/X1-a 文件。除了上面引用的 URL 中的“原始”之外,我什么都看不到,所以我不能说输出文件是否有问题。

注意,正如我不断告诉人们的那样,当您使用 pdfwrite 时,您并不是在“转换”输入的 PDF 文件,而是根据原始 PDF 文件中存在的标记运算符创建一个全新的 PDF 文件。然而,实际的新页面描述不一定与原始页面有任何关系。

【讨论】:

两个问题:1)你知道基于cli的任何其他方式吗? 2) 我怎样才能转换成 PDF/X3(这应该可以用 gs)?因此我需要一个 def.ps 文件.. pdfx_def.ps 文件将生成一个有效的 PDF/X3 文件(我刚刚检查了 Acrobat 预检)。但是,第一页的颜色有些奇怪(尽管当前代码的透明度是正确的)。我所知道的可以从通用 PDF 文件创建 PDF/X 文件的唯一其他工具是 Acrobat。请注意,由于 PDF/X3 也不支持透明度,因此您最终仍会看到第 1 页是一个大位图图像。 到目前为止,从我们的角度来看,位图还不错。但是如果我有两个相互重叠的向量(尤其是在它们上面有一个字体)会发生什么?栅格化了吗? 任何具有透明度的页面都会呈现为图像。

以上是关于使用 Ghostscript 将 PDF 转换为 PDF/X1a 时透明度丢失的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ghostscript 将 TIFF 转换为 PDF

Ghostscript将pdf转换为方向错误的pcl

使用 PHP(ghostscript) 将 PDF 转换为图像耗时太长

Ghostscript:将 PDF 转换为 CMYK EPS

无法使用 ImageMagick 和 GhostScript 将 PDF 转换为 JPG

使用 Ghostscript 将 PDF 转换为 PDF/A 时出错