Невозможно извлечь цветовые пространства cmyk из PDF

Я пытаюсь извлечь данные цветового пространства из PDF. У меня есть файл с цветовыми пространствами Pantone и CMYK. Когда я извлекал цветовые пространства из PDF, используя любую библиотеку pdf (я использовал pdfclown, pdfbox и icePdf), выходные данные состояли только из данных цветовых пространств 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
                    }
        }
}

Образец документа PDF с цветами CMYK и PANTONE

Вывод из pdfclown, показывающий PANTONE и его альтернативные цветовые пространства:

Скриншот

1 ответ

Решение

Оригинальный ответ

К сожалению, вы не показываете свой код. Но ваш снимок экрана выглядит так, будто вы просто смотрите на раздел ColorSpace на странице Ресурсы. Этого недостаточно по нескольким причинам:

  • Прежде всего, на ресурсы цветового пространства ссылаются по имени из потоков контента (см. Запись " Содержимое" на снимке экрана), чтобы выбрать цветовые пространства для обводки или заливки. Но есть некоторые предопределенные имена, которые не нужно описывать в ресурсах, ср. документация оператора КС:

    Установите текущее цветовое пространство, которое будет использоваться для операций штриховки. Имя операнда должно быть именем объекта. Если цветовое пространство может быть задано именем без дополнительных параметров (DeviceGray, DeviceRGB, DeviceCMYK и в некоторых случаях Pattern), имя может быть указано напрямую. В противном случае это должно быть имя, определенное в подкатегории ColorSpace текущего словаря ресурсов.

    (ISO 32000-1, Таблица 74 - Операторы цвета)

    Таким образом, чтобы проверить, используются ли DeviceGray, DeviceRGB или DeviceCMYK, вы должны отсканировать поток контента для операций выбора цветового пространства (CS или CS), используя эти имена.

    Кроме того, существуют даже операции быстрого выбора цвета, которые устанавливают любое из этих цветовых пространств и сразу же выбирают в нем цвет (g, G, rg, RG, k, K), для которого вы также должны сканировать поток контента.

    Например, в потоке контента вашей страницы вы можете найти:

    0.3 0 1 0 k
    

    а также

    0.9 g
    

    и множество других вхождений этих операторов. Таким образом, по крайней мере DeviceGray и DeviceCMYK используются (в дополнение к ресурсам, которые вы нашли).

  • Кроме того, не все цветовые пространства, которые вы найдете в словаре ресурсов " Цветовое пространство", обязательно используются в контенте. Таким образом, при сканировании содержимого, как указано выше, для использования необъявленных пространств имен, вы также должны сканировать объявленные пространства имен, чтобы убедиться, что они действительно используются.

  • Вы также должны посмотреть на другие ресурсы, используемые из ваших потоков контента:

    • Растровые изображения (XObjects со значением Subtype Image), например, Im1 имеет ColorSpace DeviceCMYK, а Im5 имеет ColorSpace DeviceRGB.

      Опять же, вы должны убедиться, что растровые изображения действительно используются в вашем потоке контента.

      Осторожно, растровые изображения JPEG2000 могут иметь собственное определение цветового пространства в своем собственном формате!

    • Затенения, все затенения в вашем PDF имеютColorSpace DeviceCMYK. Снова убедитесь, что они действительно используются.

    • Form XObjects и Patterns имеют собственные потоки контента и ресурсы. Не забывайте углубляться в их структуру. В вашем случае, тем не менее, нет.

    • Глифы шрифтов типа 3 определяются через потоки контента и ресурсы, они также могут иметь свое собственное цветовое пространство. Ни один не используется в вашем файле.

    • Группы прозрачности также могут иметь настройку цветового пространства, определяющую, среди прочего,цветовое пространство группы в целом, когда она, в свою очередь, закрашивается как объект на заднем плане.

  • ...

Может быть, я забыл 1 или 20 других мест, чтобы искать соответствующие настройки цветового пространства...

Однако для вашего файла уже упомянутые выше места показывают, что в дополнение к вашим ресурсамColorSpace в вашем PDF- файле используются также DeviceGray, DeviceRGB и DeviceCMYK.

На комментарии

Поскольку вы тем временем предоставили код, и этот код использует PDF Clown, я буду использовать его и здесь. Вы можете делать эквивалентные вещи с PDF Box.

Сканирование через поток контента

A Как сканировать через ContentStream (проверил BaseDataObject объекта "Contents", это похоже на '[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 Независимо от того, используется ли цветовое пространство или нет, я хочу отобразить все цветовые пространства, доступные в pdf, и в приведенном выше документе, когда я проверял в CorelDraw, он отображал около 30-35 цветовых пространств в виде cmyk(во второй строке горизонтального массива цветовых пространств).)

Просматривая документ, всякий раз, когда используется цвет CMYK, он используется через цветовое пространство DeviceCMYK, а не специальное цветовое пространство на основе ICC. Таким образом, только одно цветовое пространство CMYK используется в вашем PDF.

У меня нет CorelDraw, поэтому я не могу сказать, что именно он вам показывает. Или вы имеете в виду отдельные цвета CMYK?

Учиться глубже

C Где я могу узнать больше об этих вещах, чтобы лучше понять?

Если под этими вещами вы подразумеваете, как все это представлено в PDF-файлах, PDF-спецификация может быть хорошей ссылкой. Самый последний, ISO 32000-2, доступен только за деньги, например, в магазине ISO, но более старый, ISO 32000-1, также предоставлен Adobe для скачивания в формате PDF32000_2008.pdf.

Другие вопросы по тегам