Невозможно извлечь цветовые пространства cmyk из PDF - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь извлечь данные о цветовом пространстве из 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 и его альтернативные цветовые пространства:

screen shot

1 Ответ

0 голосов
/ 12 июня 2018

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

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

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

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

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

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

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

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

    0.3 0 1 0 k
    

    и

    0.9 g
    

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

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

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

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

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

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

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

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

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

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

  • ...

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

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

В комментариях

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

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

A Как сканировать с помощью ContentStream (проверено BaseDataObject из «Содержания», это так «[0] {см [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 (во второй строке горизонтального массива цветовых пространств)используется через цветовое пространство DeviceCMYK , без специального ICCBased одного. Таким образом, только одинЦветовое пространство CMYK используется в вашем PDF.

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

Узнайте глубже

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

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

...