Ghostscript:获取用于从 PDF 渲染的 CMYK 值

Posted

技术标签:

【中文标题】Ghostscript:获取用于从 PDF 渲染的 CMYK 值【英文标题】:Ghostscript: get CMYK values for rendering from PDF 【发布时间】:2015-01-12 06:33:07 【问题描述】:

我需要从 PDF 中获取用于渲染的 CMYK 值。

我认为它们是 C1 键下 0 - 1.0 范围内的值。

有谁知道如何获得它们?

【问题讨论】:

【参考方案1】:

CMYK 值与“C1”键无关。 可能有一个定义为 /C1 的色彩空间,但它不包含 CMYK 值。

对于那些不是设备空间的空间(即不是灰色, RGB 或 CMYK)颜色首先转换为设备空间之一。然后在 PDF 参考中定义了有关设备空间如何相互转换的规则。

对象的实际颜色分量将在对象的内容流中定义(对于页面或表单上下文中的矢量对象)或二进制数据(对于图像),或从函数计算(着色字典) .

为了找到其中任何一个,您需要阅读 PDF 文件,根据需要解压缩流,找到您想要获取信息的对象,然后确定当前的色彩空间。然后,您可以将定义对象的任何颜色空间中的颜色分量转换为 CMYK。

也许如果你解释了你的实际目标是什么,可能会更有帮助。

[更新]

您可以通过设置 ColorConversionStrategy=Gray 简单地使用 Ghostscript 创建一个新的灰度 PDF。

这样做的好处是可以处理 PDF 的所有元素,而不仅仅是图像。

您是否意识到 PDF 文件通常不仅仅包含光栅图像?可以有文本、线条、阴影,透明度组也可以定义为在给定的颜色空间中操作。这不是一项简单的任务。

如果您真的只处理图像,那么 ColorSpace 是在图像字典中定义的(它可能是间接引用)。您必须解析 PDF 文件(可能解压缩它)才能找到颜色空间定义。然后由图像数据给出每个分量的样本值。这些范围为 0-65535(取决于图像字典中的 BPC、1、2、4、8 或 16),您必须应用解码数组将值映射到适合颜色空间的范围内。

如果您想转换为灰度,则必须将转换应用到灰度。复杂空间将包括一种映射到设备空间的方法,设备空间之间的转换在 PDF 参考手册中有介绍。对于 ICCBased 空间,您将需要一个 ICC 颜色管理引擎,您可能想考虑 LCMS,或者您可以自己编写。

【讨论】:

感谢您的回复。我有一个 PDF,其中定义了一个色彩空间,我需要将其转换为灰度 PDF。我正在从 PDF 中提取图像——而不是将每个像素转换为亮度,然后使用转换后的图像创建一个新的 PDF。这适用于黑白 pdf,但如果定义了色彩空间 - 图像将渲染为定义的颜色(例如 - 洋红色),因此纯黑色渲染为纯洋红色。我知道如何检索这些值需要知道如何在我的颜色转换为 Gray Sacel 时将它们考虑在内 您可以简单地使用 Ghostscript 通过设置 ColorConversionStrategy=Gray 来创建新的灰度 PDF。这样做的好处是可以处理 PDF 的所有元素,而不仅仅是图像。您确实意识到 PDF 文件通常不包含光栅图像? 嗨,KenS,我继续探索这个问题,并提出了与您建议的相同的解决方案。我设法让 GhostScript 将其页面保存到 Gray Tiff 文件。现在,我看到的是应该被翻译成纯黑色的东西 - RGB (0,0,0) 被翻译成深灰色 RGB (102,102,102) - 所以现在这正是我的问题......如何如果我知道页面来自的 PDF 使用的 ColorSpace,我会将这个值转换为黑色? Ghostscript 不会将纯黑色更改为如此不同的灰色值。现在是您发布示例以便对其进行检查的时候了。关于 Ghostscript 中的颜色管理的文档中有相当大的部分,如果您想获得特定的结果,您将需要阅读它。但在这种情况下,我怀疑这是否真的是正在发生的转变。一方面,如果您转换为灰度,颜色值不会是三元组 (RGB),而是单字节。 这是我的代码:GhostscriptVersionInfo _lastInstalled = new GhostscriptVersionInfo(new System.Version(0, 0, 0), @"gsdll64.dll", string.Empty, GhostscriptLicense.GPL);列表 开关 = 新列表(); switch.Add("gs"); switch.Add("-dSAFER"); switch.Add("-dBATCH"); switch.Add("-dNOPAUSE"); switch.Add("-dNOPAUSE"); switch.Add("-sDEVICE=tiffgray"); switch.Add("-r300"); switch.Add("-sProcessColorModel=DeviceGray"); switch.Add("-sOutputFile=figure.tif"); switch.Add(file);

以上是关于Ghostscript:获取用于从 PDF 渲染的 CMYK 值的主要内容,如果未能解决你的问题,请参考以下文章

为啥通过 ghostscript API 渲染图像需要这么多时间?

可以用ghostscript显示渲染PS文件的进度吗?

如何使用 GhostScript 设置 PDF 文件的输出图像大小限制

Ghostscript:ps2pdf 不适用于 Win 7 32 位

使用 Ghostscript 从单个 JPG 文件创建 PDF - PDF 中的图像放置问题

GhostScript - 从 pdf 转换为 jpg 后文本错位