无法从pdf中提取cmyk色彩空间

时间:2018-06-12 08:55:39

标签: pdf pdfbox color-space pdfclown

我试图从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及其替代色彩空间:

screen shot

1 个答案:

答案 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