使用 CMYK 和透明度将 PDF 转换为 Tiff

Posted

技术标签:

【中文标题】使用 CMYK 和透明度将 PDF 转换为 Tiff【英文标题】:Convert PDF to Tiff With CMYK and Transparency 【发布时间】:2018-05-30 19:36:56 【问题描述】:

我正在尝试从 PDF 转换为 TIFF,并同时保持 CMYK 颜色空间和 PDF 中的透明区域。有很多帖子说“只使用 PNG”,但对于我的应用程序来说,CMYK 颜色空间是必须的,而且 PNG 不支持 CMYK。我开始使用 Imagemagick (IM) 进行这项工作,并取得了有限的成功,但到目前为止直接使用 Ghostscript 取得了更好的结果(这就是 IM 在幕后使用的东西)。不断出现的问题是 PDF 中的透明区域被白色填充。

上下文: Ubuntu 16.04.3 LTS (AWS)、Ghostscript 9.23、ImageMagick 7.0.7-36

我创建了一个测试 PDF,它具有透明背景和重叠的纯色和半透明色块: trans-test.pdf

我已验证 PDF 具有正确的透明区域。如果我使用 PNG(因此使用 RGB 颜色空间),我得到的结果图像具有与 PDF 匹配的透明区域,但是,唉,错误的颜色空间: output.png

(请记住:网络浏览器会以白色背景显示它,但它确实是透明的)

对于转换,我尝试了以下命令的变体(为发布而简化):

Imagemagick: convert -depth 8 -colorspace CMYK trans-test.pdf output.tif

鬼脚本: gs -sDEVICE=tiff32nc -sOutputFile=output_gs.tif -r144 trans-test.pdf

在 IM 中,处理 CMYK PDF 的代理使用 pamcmyk32 设备。有些人建议将其更改为 pngalpha ,但这会强制对 RGB 颜色空间进行不必要的更改。有些人建议先转换为 PNG,然后再转换回 CMYK,但这会导致颜色数据丢失。

直接使用 Ghostscript,TIFF 的任何设备选项都没有任何透明度选项。在挖掘了一段时间后,我发现了来自 Artifex (KenS) 开发人员的旧帖子回复,指出“至于 TIFF,GS 不支持使未标记区域透明”。: Conversion...does not maintain transparency

这令人沮丧,但这是从 2011 年开始的,所以我希望现在有一些解决方法可以解决这个问题。我正在寻找对 Ghostscript 的一些配置更改,这将使我能够将所有未标记的区域设置为透明,或者让它从一个被擦除为透明而不是白色的页面开始。

TIFF 文件格式同时支持 CMYK 颜色空间和透明度,因此必须有一种方法可以将两者放在同一个文件中。在这一点上,任何关于如何在 TIFF 中获取两者的见解都将受到欢迎。感谢阅读。

【问题讨论】:

据我所知,Ghostscript 仍然不会处理 CMYK 颜色空间中的透明度。在阅读 PDF 之前,您可以使用 ImageMagick 使用 -colorspace sRGB(它使用 Ghostscript)将 CMYK PDF 转换为 sRGB,然后在完成此操作后,您可以通过在输出 TIFF 之前将配置文件从 sRGB 添加到 CMYK 来转换为 tiff。 magick -colorspace sRGB -density XX image.pdf -profile path/to/sRGB.icc -profile path/to/USWebCoatedSWOP.icc image.tiff 感谢弗雷德的回复。我是你剧本的忠实粉丝。我绝不是色彩空间方面的专家,但我在这个项目上与一位专家合作。据我了解,从 CMYK 转换为 RGB 再转换回 CMYK 会导致颜色数据退化。如果我按照您建议的流程进行操作,不会发生这种情况吗? -谢谢 只是因为使用了 -colorspace sRGB 而不是配置文件。但是由于您的输入是 CMYK pdf,它是否有配置文件。如果没有配置文件,则您的 CMYK 颜色未明确定义为可在所有查看平台上重现。你真的需要有个人资料。您的 PDF 是否包含光栅图像?如果是这样,那么最好使用 pdfimages 从 PDF 中提取图像并从那里进行处理,尤其是在光栅图像具有内置配置文件的情况下。试试我的命令,看看有多大的不同。或者发布你的 PDF,我可以试试。 我刚刚进行了一些颜色测试,在其中进行了从 CMYK -> sRGB ->CMYK 的转换。正如预期的那样,我得到的是个别颜色的一些轻微漂移。我认为它们并没有那么重要,但我的共同开发者认为它们足以引起人们的关注,可以尝试避免转换链。看起来我可能不得不从@KenS 回到 cmets 并尝试让 Ghostscript 跳过 PDF 转换的白色填充部分。除非我能解决这个问题,否则与 IM 或 Ghostscript 相关的任何事情都会有同样的问题。 您的 CMYK -> sRGB ->CMYK 使用了什么类型的图像。您只是使用 -colorspace 还是使用了配置文件。 ImageMagick 在光栅图像和配置文件方面做得很好。由于 Ghostscript 的限制,如果 PDF CMYK 文件具有透明度,则会出现问题。 【参考方案1】:

需要一些创造性的解决方案来解决委托限制——正如 cmets 中所指出的那样。

我建议将透明度提取到中间蒙版,并在启用 CMYKA 数据通道后重新应用。

# Create transparent mask (we don't care about colorspace, just grab the alpha channel values)
convert -depth 8 -colorspace sRGB trans-test.pdf -alpha Extract mask.png
# Apply mask _after_ enabling alpha channel
convert \( \
        -depth 8 \
        -colorspace CMYK \
        trans-test.pdf \
        -alpha Activate \
    \) \
    mask.png -compose CopyAlpha -composite output.tif

-alpha Activate 开启了 alpha 通道,但没有数据,所以一切都是透明的。跟随mask.png -compose CopyAlpha -composite 使用从上一个操作中提取的值填充 alpha 通道。

【讨论】:

感谢您的回复。我确实考虑过尝试这样的事情。我遇到了初始转换仍然在部分透明区域后面放置白色的问题。见link。黄色区域现在是灰色而不是透明的。红色区域是真正的问题。即使 alpha 提取/替换效果很好,该区域后面仍然有白色,使其“乳白色”而不是半透明。我错过了透明区域变灰的东西吗? -谢谢 灰色是OSX的Preview.app的背景,虚线代表图像边缘。这是 S.O. 形象的一个例子。不支持tif 图片 - 很抱歉造成混淆。 到目前为止,我一直非常依赖 Gimp 来查看我的图像,因为它非常清楚哪些区域是透明的并且具有良好的分析工具。在@fmw42 发布后,我返回并检查了您在 Adob​​e Illustrator (AI) 中的解决方案生成的图像,发现在 Gimp 中显示为白色的区域,包括我以红色突出显示的区域,在 AI 中显示为透明。有一些色彩空间改变,我仍在研究。在这一点上,我什至怀疑图像查看器工具。很快。 -谢谢 以下是我在最近的测试中了解到的关于 GIMP 的两个限制:1) GIMP 无法处理具有透明度的 CMYK tif 文件。如果文件具有透明背景,它将在白色背景中标记彩色区域。内接区域中同样透明的区域将变为黑色。到目前为止,我能够验证这一点的唯一方法是在 Adob​​e Illustrator 中打开文件进行交叉检查。 2) 对于 CMYK 文件,GIMP 将 cmyk(255,255,255,0) 和 cmyk(255, 255, 255, 255) 转换为 (0,0,0,255)。当您使用指针/示例工具查看特定像素的值时,您会看到这一点。【参考方案2】:

我将我的解决方案与 emcconville 的解决方案进行了比较。他的方法应该是一个不错的方法,但我的配置文件解决方案似乎更好地匹配 Mac OSX Sierra Preview、GraphicConverter 和 Photoshop 中显示的已保存 tif 文件中的颜色。以下命令是 IM 7.0.7.37 Q16 HDRI 和 LIBTIFF 版本 4.0.9 Ghostscript 9.23 中的 unix 语法。您可以从magick -list format 查看您的版本。

输入: trans-test.pdf

我的解决方案:

magick -depth 8 -colorspace sRGB trans-test.pdf \
-profile /Users/fred/images/profiles/sRGB.icc \
-profile /Users/fred/images/profiles/USWebCoatedSWOP.icc \
trans-test_profile.tif

trans-test_profile.tif

emcconville 的解决方案:

magick -depth 8 -colorspace sRGB trans-test.pdf -alpha Extract mask.png

magick \( -depth 8 -colorspace CMYK trans-test.pdf \) \
mask.png -alpha off -compose CopyOpacity -composite \
trans-test_mask.tif

trans-test_mask.tif

请注意,-compose copyOpacity 或 copyAlpha 通常需要关闭 -alpha。因此,我认为没有任何理由添加 -alpha activate。

这是我的代表:

Version: ImageMagick 7.0.7-37 Q16 x86_64 2018-05-30 https://www.imagemagick.org
Copyright: © 1999-2018 ImageMagick Studio LLC
License: https://www.imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenMP 
Delegates (built-in): bzlib cairo djvu fftw fontconfig freetype gslib gvc jbig jng jp2 jpeg lcms lqr ltdl lzma openexr png ps raw rsvg tiff webp x xml zlib

【讨论】:

感谢您的回复。您的 tif 输出的链接似乎已损坏。我尝试了您的解决方案,得到的结果是 CMYK,但透明度数据仍显示为白色。还添加了黑条 感谢您的回复。您的 tif 输出的链接似乎已损坏。我试过你的解决方案。我得到的结果是 CMYK,但透明度数据仍显示为白色。在绿色区域旁边还添加了一个黑条。请参阅link 奇怪的是,只有在使用 Gimp 在 Linux 上查看时,该条才会显示为黑色。在 Windows 中查看以发布它显示为白色。查看 Gimp 中新的黑色区域,它与应该透明的白色区域具有相同的 alpha 值。不知道为什么它会以不同的方式呈现。我会研究那个。 -谢谢 抱歉链接断开。我已经修复了它们,现在。请注意,有些观众不知道如何在没有配置文件的情况下正确显示 CMYK(A)。我不确定这是否是问题所在。它们在 Safari 中的我的 Mac OSX Sierra 上也如上文所述显示。 Windows 语法不同。删除之前的 \ ( ... ),将行尾更改为 ^。 IM 版本和 libtif 也可能存在问题。在 IM 6 中,需要对掩码求反。我的结果没有显示那个黑条。 请参阅上面对我的回答所做的修改,其中包含有关我的系统配置和固定链接的一些信息。 我的 Mac 上的奇怪 GIMP 2.8 显示我的解决方案,并带有您提到的黑条,但不是其他解决方案。而且颜色几乎都是一样的。但正如我在我列出的工具中提到的那样,它们显示得很好。所以我不得不假设这是一个 GIMP 问题。

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

imagemagick 将 RGB PNG 转换为 CMYK PDF

Ghostscript:将 PDF 转换为 CMYK EPS

Ghostscript 将 cmyk-PDF 转换为 rgb-PNG 并保留正确的颜色

如何在 C++ 中创建 CMYK 模式图像?

将 .tif 转换为 pdf/A 1.4 或 1.5

Java如何把一个PDF转为tif