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

时间:2017-08-01 07:02:04

标签: pdf pdfbox

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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