以PDF格式嵌入ICC颜色配置文件

时间:2015-07-23 15:17:37

标签: linux pdf ghostscript color-profile color-management

我正在生成一个PDF,其中所有图形都在sRGB颜色空间的\ DeviceRGB中绘制。我想使用ICC配置文件将PDF转换为不同的颜色配置文件并嵌入ICC配置文件,但我找不到一个好的工具来执行此操作。

我尝试过ImageMagick,但是光栅化PDF是不受欢迎的,我尝试过使用Ghostscript。但是虽然它会转换颜色,但它并没有嵌入ICC配置文件。

是否有可用于Linux的工具或库(最好是Java或Scala)能够满足我的需求?

我尝试过的Ghostscript命令是:

gs -o cmyk.pdf -sColorConversionStrategy=CMYK -sDEVICE=pdfwrite \
   -dOverrideICC=true -sOutputICCProfile=CoatedFOGRA27.icc \
   -dRenderIntent=3 in.pdf

gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -ColorConversionStrategy=CMYK \
   -dProcessColorModel=/DeviceCMYK -sOutputICCProfile=CoatedFOGRA27.icc \
   -sOutputFile=cmyk.pdf in.pdf 

以及上述的几种变体。我已经尝试了Ghostscript版本9.10和9.16。

2 个答案:

答案 0 :(得分:5)

使用Ghostscript。

使用最新版本v9.16。

在此下载:

阅读其有关ICC颜色配置文件支持的(最新)文档,可在此处获取:

将转换颜色空间并嵌入ICC配置文件的

命令是:

gs -o cmyk-doc.pdf      \
   -sDEVICE=pdfwrite    \
   -dOverrideICC=true   \
   -sDefaultCMYKProfile=/path/to/mycmykprofile.icc \
   -sOutputICCProfile=/path/to/mydeviceprofile.icc \
   -dRenderIntent=3     \
   -dDeviceGrayToK=true \
    input-doc.pdf

-dRenderIntent:可能的参数是0(感知),1(比色),2(饱和度)和3(绝对色度) 。)

注意事项

如果您使用上述命令在屏幕上(或在纸上,打印时)查看PDF文件并使用...

  • ......未经校准的显示器/屏幕,
  • ...未经校准的打印设备,
  • ......未经校准的房间照明,
  • ...无法处理嵌入式ICC配置文件的PDF阅读器,

你可能会感到非常失望。或者您使用了错误的ICC配置文件。或者您使用的纸张类型与输出配置文件所期望的纸张类型不匹配。或者您还不够了解ICC色彩管理。

但是不要怪Ghostscript对你没想到的结果看起来像是一个下意识的反应......

答案 1 :(得分:0)

AFAIU,Ghostscript 9.12-9.27无法满足您的期望。
但您也许可以部分实现目标:

  • 尝试UseDeviceIndependentColor
    这不会嵌入您的配置文件,也不会将颜色转换为您的配置文件。但这会使您为颜色“按色定义”,并嵌入 some icc配置文件。如果您的目标是“保留”颜色,那可能对您有用。

  • 尝试PDF/X-3输出,嵌入“ Output Intent” icc配置文件。

  • 尝试调整DefaultRGB colorspace-在docs中注意以下短语:

      

    如果用户需要非平凡的颜色调整,则必须定义非平常的DefaultRGB颜色空间

    (我从未尝试过。)

一个玩具例子

原始文件:

Colorbar foxit.PNG

gs命令:

 gswin64c -dPDFX -dBATCH -dNOPAUSE -dHaveTransparency=false -r20 
  -dProcessColorModel=/DeviceCMYK -sColorConversionStrategy=UseDeviceIndependentColor 
  -sDefaultRGBProfile="default_rgb.icc" -sOutputICCProfile="cmyk_des_renderintent.icc" 
  -dRenderIntent=1 -dDefaultRenderingIntent=/Perceptual -sDEVICE=pdfwrite 
  -sOutputFile=colorbar_v1.pdf PDFX_IntCmyk.ps Colorbar.pdf

在Adobe Acrobat中,输出看起来像这样(它遵循嵌入式“ Output Intent” icc配置文件): enter image description here

Foxit Reader中的相同文件(它忽略嵌入的“输出意图”): enter image description here

这是怎么回事:

  • cmyk_des_renderintent.icc 个人资料,如"Ghostscript 9.21 Color Management"中所述, 旨在使不同的意图输出不同的颜色:
    • “感知”呈现意图(0)仅输出青色,
    • “ RelativeColorimetric”意图(1)仅输出品红色
    • “饱和度”渲染意图(2)仅输出黄色。
  • -dHaveTransparency=false确保将第二页光栅化(由于存在带有透明度的tikz图片)
  • -r20确保光栅化清晰可见(由于只有20dpi)
  • -sOutputICCProfile="cmyk_des_renderintent.icc" -dRenderIntent=1使光栅化器产生品红色输出。
    • 请注意,current docs中未提及OutputICCProfile参数, 因为this9.27 docs有点过时了)。
    • 在这种情况下,
    • RenderIntent也未记录。它也只影响栅格化。
  • -dDefaultRenderingIntent=/Perceptual将所说的意图放在“输出意图icc配置文件”旁边的元数据中。这使Acrobat可以用青色绘制所有内容。
  • -sDefaultRGBProfile="default_rgb.icc"是用于输入icc配置文件的可能实验的占位符。如果省略此参数,则设置相同的默认值。
    如果您知道输入配置文件是sRGB(但未嵌入-pdf是纯\DefaultRGB),则在此处明确指定配置文件可能是一个好主意。 即使sRGB是默认设置。
  • 我使用修改后的gs/lib/PDFX_def.ps 来自Ghostscript存储库,该存储库将cmyk_des_renderintent.icc嵌入为“输出意图”。

您可以找到此实验here中使用的所有文件。 还有其他几个实验。 我创建它们的目的是为了了解色彩管理在gs中的工作方式。我希望他们能对此有所启发。 还与Adobe Acrobat“转换颜色”工具进行了比较。 AFAIU,它完全符合您的期望。

当涉及到pdf输出的颜色管理时,KenS(gs dev)通常为says“ pdfwrite设备会竭尽全力以保持输出中输入的颜色规格不变”。在这种情况下,似乎他们并没有真正专注于从一个配置文件转换到另一个配置文件的事情。好吧...这几乎不是“最需要的”功能。