【问题标题】:Reading CMYK colors for graphic vectors from PDF从 PDF 中读取图形矢量的 CMYK 颜色
【发布时间】:2017-08-01 07:02:04
【问题描述】:

我正在尝试从 PDF 文件中读取 CMYK 颜色以获取图形矢量,我正在使用 PDFBOX 2 读取颜色空间,返回的颜色空间是 PDSeparation 类型,具有 PDDeviceCMYK 的替代颜色空间,我不知道如何继续使用 PDDeviceCMYK,所以我提取了 RGB 颜色并将它们转换回 CMYK,但我什至没有找到将它们转换回 CMYK 的函数,所以有没有办法直接从 PDDeviceCMYK 提取 CMYK 颜色?

PDColor color = getGraphicsState().getNonStrokingColor();
PDSeparation colorSpace = (PDSeparation) color.getColorSpace();
float[] rgb = colorSpace.toRGB(color.getComponents()); 

【问题讨论】:

  • 看看 PDSeparation.java。它通过float[] altColor = tintTransform.eval(value); 获取替代色彩空间中的值。这些东西大部分是私有的/受保护的,所以你需要复制代码。
  • @TilmanHausherr 谢谢,我在调用 colorSpace.toRGB(color.getComponents()); 之后在 altColor 上添加了断点,结果是 [1.0, 1.0, 1.0, 1.0],是正确的 cmyk 值?我不确定,我是否应该将 color.getComponents 作为参数传递,这就是 PageDrawer 至少在 getPaint 函数中所做的。
  • 你是对的 Tilman,我通过从 PDSeperation.java 复制代码获得 CMYK 并将其放入我的函数中,再次感谢。
  • 我建议你自己回答这个问题。或者 ping KenS 以便他将其添加到他的答案中。他的回答是正确的,但有点抽象。

标签: pdf pdfbox


【解决方案1】:

分色空间中没有 CMYK 颜色,它是专色,例如 Pantone 颜色或类似银色或金色的颜色。您使用特定所需的墨水打印它。

为了在没有所需墨水的设备上打印(和显示)内容,分隔空间具有备用颜色空间以及将输入墨水百分比转换为该颜色空间的方法。

在您的情况下,备用是 DeviceCMYK,将有一个 PDF 函数,它接受 1 个输入并返回 4 个输出。给定介于 0 和 1 之间的分色油墨颜色,它将返回等效的 CMYK 值。

也没有 RGB 组件可供您从文件中恢复,我假设 colorSpace.toRGB() 正在检索墨水值,运行函数将其转换为 CMYK,然后将 CMYK 转换为 RGB。假设 pdfbox 有一个 colorSpace.toCMYK() 函数,我会使用它。

【讨论】:

  • 实际上,我没有到达任何设备,我只想显示正在使用的颜色的值,我没有找到我在 PDF 框中的 pageDrawer 上搜索的函数 colorspace.toCMYK() 和发现他们使用类似于上述代码的代码提取 RGB 颜色,结果为 0.003524834 0.0 0.0 我假设输出是在该图形状态下使用的正确 RGB 颜色,对吗?编辑:误按帖子
  • 是否打算将结果用于设备并不重要。 PDF 用于渲染到设备,这就是规范要求 /Separation 空间使用备用颜色空间的原因。我对 PDFBox 一无所知,所以我无法帮助您,但是如果您的色彩空间有 DeviceCMYK 备用空间,那么就有 RGB 组件;一个都没有。如果当前颜色空间是 DeviceRGB,则图形状态将仅保存有效的 RGB 组件,而事实并非如此。您使用的代码在我看来就像我在回答 Separation->CMYK->RGB 中所说的那样。
【解决方案2】:

除了@KenS 在他的第一条评论中所说的,在@Tilman 的帮助下,您可以通过覆盖 PDSeperation.java 中的受保护/私有代码来提取 CMYK 颜色,您可以这样做,我不是发布整个代码,但阅读颜色的部分发布在下面

private static final int TINT_TRANSFORM = 3;

PDColor color = getGraphicsState().getNonStrokingColor();
COSArray array = (COSArray) color.getColorSpace().getCOSObject();
PDFunction tintTransform = PDFunction.create(array.getObject(TINT_TRANSFORM));
cmykColor = tintTransform.eval(color.getComponents());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多