我试图从pdf中提取色彩空间数据。我有一个Pantone和CMYK颜色空间的文件。当我使用任何pdf库(我使用pdfclown,pdfbox和icePdf)从PDF中提取色彩空间时,输出数据仅包含Pantone色彩空间数据,但甚至不包含有关CMYK色彩空间的单个信息。我在CorelDraw软件中检查了文件,当我点击颜色空间时,它显示了确切的颜色空间值(PANTONE 3735 C,C 0 M 50 Y 50 K 0 e.t.c)。如何提取pdf(Pantone / CMYK)中的所有色彩空间?
using (var file = new org.pdfclown.files.File(filePath))
{
org.pdfclown.documents.Document document = file.Document;
foreach (org.pdfclown.documents.Page page in document.Pages)
{
ContentScanner cs = new ContentScanner(page); // Wraps the page contents into the scanner.
System.Collections.Generic.List<org.pdfclown.documents.contents.colorSpaces.ColorSpace> list = cs.Contents.ContentContext.Resources.ColorSpaces.Values.ToList();
for (int i = 0; i < list.Count; i++)
{
// Print list of colorspaces available
}
}
}
示例 PDF Document具有CMYK和PANTONE颜色
Output来自&#39; pdfclown &#39;显示PANTONE及其替代色彩空间:
答案 0 :(得分:2)
很遗憾,您不会显示您的代码。但是您的屏幕截图看起来只是查看页面资源的 ColorSpace 部分。这在许多方面都不够:
首先,颜色空间资源通过内容流的名称引用(参见屏幕截图中的目录条目),以选择用于抚摸或填充的颜色空间。但是有一些预定义的名称不需要在资源中描述,参见 CS 运算符的文档:
设置用于描边操作的当前颜色空间。操作数名称应为名称对象。如果颜色空间是可以通过名称指定的颜色空间而没有其他参数( DeviceGray , DeviceRGB , DeviceCMYK ,以及<的某些情况< strong> Pattern ),可以直接指定名称。否则,它应该是当前资源字典的 ColorSpace 子字典中定义的名称。
(ISO 32000-1,表74 - 颜色运算符)
因此,要检查是否使用 DeviceGray , DeviceRGB 或 DeviceCMYK ,您必须扫描内容流以进行色彩空间选择操作( CS 或 cs )使用这些名称。
此外,甚至还有快捷颜色选择操作,可以设置其中任何一个颜色空间并立即选择其中的颜色( g , G , rg , RG , k , K ),您还必须扫描内容流。
E.g。在您的页面内容流中,您可以找到:
0.3 0 1 0 k
和
0.9 g
以及这些运算符的多个其他匹配项。因此,至少 DeviceGray 和 DeviceCMYK 正在使用中(除了您找到的资源之外)。
此外,并非您在 Colorspace 资源字典中找到的所有颜色空间都必须在内容中实际使用。因此,在扫描上述内容以使用未声明的命名空间时,您还必须扫描声明的命名空间以确保实际使用它们。
您还必须查看内容流中使用的其他资源:
位图图像(具有子类型值图像的XObjects),例如 Im1 ColorSpace DeviceCMYK , Im5 ColorSpace DeviceRGB 。
同样,您必须确保实际在您的内容流中使用位图。
请注意,JPEG2000位图可能会以自己的格式带来自己的色彩空间定义!
着色,PDF中的所有着色都有 ColorSpace DeviceCMYK 。再次确保他们真正使用过。
表单XObjects和Patterns具有自己的内容流和资源。不要忘记深入研究他们的结构。但在你的情况下,没有。
类型3字体字形是通过内容流和资源定义的,它们也可能有自己的颜色空间。您的文件中没有使用。
透明度组也可能有一个颜色空间设置,除此之外还指定整个组的颜色空间,当它反过来被绘制为背景上的对象时。
...
也许我忘了1或20个其他地方寻找相关的色彩空间设置......
对于您的文件,上面提到的地方已经显示除了 ColorSpace 资源还 DeviceGray , DeviceRGB 和< strong> DeviceCMYK 用于您的PDF。
当你同时提供代码并且此代码使用PDF Clown时,我也会在这里使用它。你可以用PDF Box做同等的事情。
A 如何浏览ContentStream(选中&#39;内容&#39;的 BaseDataObject ,就像这样&#39; [0] {cm [1,0,0,1,0,0}},1 {gs [GS11]}&#39;
使用PDF Clown,您通常使用ContentScanner
扫描内容流。在您的代码中,您已经拥有ContentScanner cs
。因此,只需在循环中调用ScanForColorspaceUsage(cs)
ScanForColorspaceUsage
定义如下:
void ScanForColorspaceUsage(ContentScanner cs)
{
while (cs.MoveNext())
{
ContentObject content = cs.Current;
if (content is CompositeObject)
{
ScanForColorspaceUsage(cs.ChildLevel);
}
else if (content is SetFillColorSpace _cs)
{
Console.WriteLine("Used as fill color space: {0}", _cs.Name);
}
else if (content is SetDeviceCMYKFillColor _k)
{
Console.WriteLine("Used as fill color space: DeviceCMYK");
}
else if (content is SetDeviceGrayFillColor _g)
{
Console.WriteLine("Used as fill color space: DeviceGray");
}
else if (content is SetDeviceRGBFillColor _rg)
{
Console.WriteLine("Used as fill color space: DeviceRGB");
}
else if (content is SetStrokeColorSpace _CS)
{
Console.WriteLine("Used as stroke color space: {0}", _CS.Name);
}
else if (content is SetDeviceCMYKStrokeColor _K)
{
Console.WriteLine("Used as stroke color space: DeviceCMYK");
}
else if (content is SetDeviceGrayStrokeColor _G)
{
Console.WriteLine("Used as stroke color space: DeviceGray");
}
else if (content is SetDeviceRGBStrokeColor _RG)
{
Console.WriteLine("Used as stroke color space: DeviceRGB");
}
}
}
B 无论是否使用色彩空间,我想显示pdf和上述文档中可用的所有色彩空间,当我在CorelDraw中检查时,它显示大约30-35个色彩空间作为cmyk (在颜色空间的水平数组的第二行)
通过您的文档,无论何时使用CMYK颜色,都会通过 DeviceCMYK 颜色空间使用,没有特殊的 ICCBased 颜色空间。因此,在PDF中只使用一个CMYK颜色空间。
我没有CorelDraw,所以我不知道它到底是什么。或者你的意思是个别的CMYK颜色?
C 我在哪里可以更深入地了解这些事情以便更好地理解?
如果通过这些东西意味着如何在PDF中表示这一切,那么PDF规范可能是一个很好的参考。最新的ISO 32000-2仅适用于货币,例如来自ISO商店,但较旧版本ISO 32000-1也由Adobe共享,可下载为PDF32000_2008.pdf。