1

我正在尝试从 pdf 中提取色彩空间数据。我有一个带有 Pantone 和 CMYK 颜色空间的文件。当我使用任何 pdf 库(我使用 pdfclown、pdfbox 和 icePdf)从 PDF 中提取色彩空间时,输出数据仅包含 Pantone 色彩空间数据,甚至不包含有关 CMYK 色彩空间的单个信息。我在 CorelDraw 软件中检查了该文件,当我单击颜色空间时,它显示了确切的颜色空间值,例如(PANTONE 3735 C、C 0 M 50 Y 50 K 0 等)。如何提取 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
                    }
        }
}

具有 CMYK 和 PANTONE 颜色的示例PDF 文档

' pdfclown ' 的输出显示 PANTONE 及其替代色彩空间:

截屏

4

1 回答 1

2

原始答案

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

  • 首先,色彩空间资源通过名称从内容流中引用(参见屏幕截图上的内容条目),以选择用于描边或填充的色彩空间。但是有一些预定义的名称不需要在资源中描述,参见。CS运营商的文档:

    设置用于描边操作的当前颜色空间。操作数名称应为名称对象。如果颜色空间是可以通过名称指定且没有附加参数(DeviceGrayDeviceRGBDeviceCMYKPattern的某些情况),则可以直接指定名称。否则,它应该是在当前资源字典的ColorSpace子字典中定义的名称。

    (ISO 32000-1,表 74 – 颜色操作符)

    因此,要检查是否使用了DeviceGrayDeviceRGBDeviceCMYK,您必须使用这些名称扫描内容流以进行颜色空间选择操作( CScs )。

    此外,甚至还有快捷的颜色选择操作,可以设置这些颜色空间中的任何一个并立即在其中选择一种颜色(gGrgRGkK),您还必须为其扫描内容流。

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

    0.3 0 1 0 k
    

    0.9 g
    

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

  • 此外,并非您在色彩空间资源字典中找到的所有色彩空间必须在内容中实际使用。因此,在扫描上述内容以使用未声明的命名空间时,您还必须扫描已声明的命名空间以确保它们实际被使用。

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

    • 位图图像(具有子类型值为 Image 的 XObjects 例如Im1具有ColorSpace DeviceCMYKIm5具有ColorSpace DeviceRGB

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

      请注意,JPEG2000 位图可能会以自己的格式带来自己的色彩空间定义!

    • 阴影,PDF 中的所有阴影都有ColorSpace DeviceCMYK。再次确保它们被实际使用。

    • 表单 XObjects 和 Patterns 有自己的内容流和资源。不要忘记深入研究它们的结构。但是,在您的情况下,没有。

    • Type 3 Fonts 字形是通过内容流和资源定义的,它们也可能有自己的色彩空间。您的文件中没有使用任何内容。

    • 透明组也可能有一个颜色空间设置,其中指定了组作为一个整体的颜色空间,当它作为一个对象被绘制到其背景上时

  • ...

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

但是,对于您的文件,上面提到的位置已经表明,除了您的ColorSpace资源之外,您的 PDF 中还使用了DeviceGrayDeviceRGBDeviceCMYK 。

关于评论

由于您同时提供了代码并且此代码使用 PDF Clown,所以我也会在这里使用它。你可以用 PDF Box 做同样的事情。

扫描内容流

A如何通过 ContentStream 扫描(检查 'Contents' 的BaseDataObject,它是这样的 ' [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");
        }
    }
}

所有色彩空间

B无论是否使用色彩空间,当我在 CorelDraw 中检查时,我想显示 pdf 和上述文档中可用的所有色彩空间,它显示为 cmyk 大约 30-35 个色彩空间(在色彩空间水平数组的第二行)

浏览您的文档,无论何时使用 CMYK 颜色,它都是通过DeviceCMYK颜色空间使用的,没有特殊的ICCBased空间。因此,您的 PDF 中只使用了一个 CMYK 颜色空间。

我没有 CorelDraw,所以我不知道它到底向您展示了什么。还是您的意思是单个 CMYK 颜色?

深入了解

C我在哪里可以更深入地了解这些事情以便更好地理解?

如果这些东西是指这一切在 PDF 中是如何表示的,那么 PDF 规范可能是一个很好的参考。最新的 ISO 32000-2 只能通过金钱获得,例如从 ISO 商店购买,但较旧的 ISO 32000-1 也由 Adob​​e 共享,以PDF32000_2008.pdf的形式下载。

于 2018-06-12T13:32:12.097 回答