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

Unable to extract cmyk colorspaces from pdf

我正在尝试从 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 来自“pdfclown”,显示 PANTONE 及其替代色彩空间:

原回答

很遗憾,您没有显示您的代码。但是您的屏幕截图看起来就像您只是查看了 Resources 页面的 ColorSpace 部分。这在很多方面都不够:

  • 首先,颜色space 资源是按内容流中的名称引用的(参见屏幕截图上的 Contents 条目) 到 select colorspaces 用于描边或填充。但是有一些预定义的名字不需要在资源中描述,cf. CS 运算符的文档:

    Set the current colour space to use for stroking operations. The operand name shall be a name object. If the colour space is one that can be specified by a name and no additional parameters (DeviceGray, DeviceRGB, DeviceCMYK, and certain cases of Pattern), the name may be specified directly. Otherwise, it shall be a name defined in the ColorSpace subdictionary of the current resource dictionary.

    (ISO 32000-1,Table 74 – 颜色运算符)

    因此,要检查是否使用了DeviceGrayDeviceRGBDeviceCMYK,你必须使用这些名称扫描内容流以查找颜色 space selection 操作(CScs)。

    此外,甚至还有快捷颜色 selection 操作,可以设置这些颜色之一 spaces 并立即 select 其中一种颜色 (g, G, rg, RG, k, K) 您还必须扫描内容流。

    例如在您的页面内容流中,您可以找到:

    0.3 0 1 0 k
    

    0.9 g
    

    以及这些运算符的其他多次出现。因此,至少 DeviceGrayDeviceCMYK 正在使用(除了您找到的资源)。

  • 此外,并不是所有你在颜色space资源字典中找到的颜色space实际上都是在内容中使用了。因此,在扫描上述内容以查找未声明的 namespace 的使用时,您还必须扫描已声明的 namespace 以确保它们确实被使用。

  • 您还必须查看内容流中使用的其他资源:

    • 位图图像(XObjects with Subtype value Image),例如Im1ColorSpace DeviceCMYKIm5ColorSpace DeviceRGB

      同样,您必须确保位图确实在您的内容流中使用。

      注意,JPEG2000 位图可能会以自己的格式带来自己的颜色space 定义!

    • 底纹,PDF 中的所有底纹都有 ColorSpace DeviceCMYK。再次确保它们确实被使用了。

    • Form XObjects 和模式有自己的内容流和资源。不要忘记深入研究它们的结构。不过,在您的情况下,有 none.

    • Type 3 字体字形是通过内容流和资源定义的,它们也可能有自己的颜色space。 None 已在您的文件中使用。

    • 透明组也可能有颜色space 设置,其中指定 整个组的颜色 space作为对象绘制到其背景上.

  • ...

也许我忘记了 1 或 20 个其他地方来寻找相关的颜色space 设置...

不过,对于您的文件,上面提到的地方已经表明,除了您的 ColorSpace 资源之外,还有 DeviceGrayDeviceRGBDeviceCMYK 用于您的 PDF。

关于评论

由于您同时提供了代码,并且此代码使用了PDF Clown,因此我也将在此处使用它。您可以使用 PDF Box 做同样的事情。

浏览内容流

A How to scan through a ContentStream ( checked the BaseDataObject of the 'Contents', it is like this ' [0] {cm [1, 0, 0, 1, 0, 0]}, 1 {gs [GS11]}'

使用 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");
        }
    }
}

所有颜色spaces

B Whether the colorspace is used or not, I want to display all the Colorspaces available in the pdf and in the above document when I checked in CorelDraw it was displaying around 30-35 colorspaces as cmyk(in the second line of horizontal array of colorspaces)

查看您的文档,无论何时使用 CMYK 颜色,都是通过 DeviceCMYK 颜色 space 使用的,没有特殊的 ICCBased 一个。因此,您的 PDF 中仅使用一种 CMYK 颜色space。

我没有 CorelDraw,所以我不知道它到底显示了什么。或者您指的是单独的 CMYK 颜色?

深入学习

C Where can I learn deeper about these things to understand better?

如果 这些东西 你的意思是这一切在 PDF 中是如何表示的,PDF 规范可能是一个很好的参考。最新的 ISO 32000-2 仅适用于金钱,例如来自 ISO 商店,但较旧的 ISO 32000-1 也由 Adob​​e 共享以供下载 PDF32000_2008.pdf.