从 PDF 中读取图形矢量的 CMYK 颜色

Reading CMYK colors for graphic vectors from PDF

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

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

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

为了在没有所需墨水的设备上打印(和显示)内容,Separation spaces 有一个备用颜色 space 和一种转换输入墨水的方法该颜色的百分比 space.

在您的情况下,Alternate 是 DeviceCMYK,并且会有一个 PDF 函数,它需要 1 个输入和 returns 4 个输出。给定一种介于 0 和 1 之间的分色油墨颜色,它将 return 等效的 CMYK 值。

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

除了@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());