Невозможно найти расположение объектов ColorSpace в документе PDF - PullRequest
0 голосов
/ 09 мая 2019

Я хочу идентифицировать ColorSpace объекты в PDF и извлечь их местоположение (координаты, ширину и высоту цветового пространства) на странице.Я попытался пройти через BaseDataObject в Contents.ContentContext.Resources.ColorSpaces, я могу определить Pantone Colours Spaces в файле (как показано на скриншоте), но не смог найти информацию о местоположении (x, y,w и h) объекта.

Где я могу найти точное местоположение видимых объектов (видимых при открытии документа), таких как ColorSpaces и встроенные изображения?

Я использую библиотеку ' pdfclown ' для извлечения информации о ColorSpaces из PDF.Любые входы будут полезны.Заранее спасибо.

ContentScanner cs =  new ContentScanner(page);     
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++)
    {
            org.pdfclown.objects.PdfArray array = (org.pdfclown.objects.PdfArray)list[i].BaseDataObject;
            foreach (org.pdfclown.objects.PdfObject s in array)
            { 
                //print colorspace and its x,y,w,h
            }
    }

Документ PDF (имеет цвета CMYK и Pantone)

Снимок экрана

Screenshot

1 Ответ

1 голос
/ 23 мая 2019

Я хочу определить ColorSpace объекты в PDF и извлечь их местоположение (координаты, ширину и высоту цветового пространства) на странице.

Я предполагаюВы имеете в виду квадраты здесь:

Pantone solid

Осторожно, это не PDF ColorSpace объектов, это ряд простых (прямоугольных) контуров, заполненных разными цветами и на которых нарисован некоторый текст.

PDF ColorSpace s не являются специфическими визуализациями цветных областей, они абстрактные спецификации цвета :

Цвета могут быть описаны в любой из множества цветовых систем, или цветовые пространства .Некоторые цветовые пространства связаны с цветовым представлением устройства (оттенки серого, RGB, CMYK), другие - с визуальным восприятием человека (на основе CIE).Некоторые специальные функции также смоделированы как цветовые пространства: узоры, цветовое отображение, разделения и высокоточные и многоцветные цвета.

(ISO 32000-1, раздел 8.6 «Цветовые пространства»)

Поскольку вы ищете что-то с координатами, шириной и высотой , поэтому вы ищете инструкции для рисования с использованием этих абстрактных цветовых пространств , а не для простые цветовые пространства .

Я попытался пройти через BaseDataObject в Contents.ContentContext.Resources.ColorSpaces, я могу определить Pantone Colorspaces в файле (какпоказано на скриншоте), но не может найти информацию о местоположении (x, y, w и h) объекта.

Если вы посмотрите на cs.Contents.ContentContext.Resources.ColorSpaces, вы получитеперечисление всех специальных цветовых пространств , доступных для использования в текущем контексте, но не фактическое использование .Чтобы получить фактические значения, вам нужно пройти через ContentScanner cs, то есть вы должны проверить инструкции в текущем контексте, например, так:

SeparationColorSpace space = null;
double X = 0, Y = 0, Width = 0, Height = 0;

void ScanForSpecialColorspaceUsage(ContentScanner cs)
{
    cs.MoveFirst();
    while (cs.MoveNext())
    {
        ContentObject content = cs.Current;
        if (content is CompositeObject)
        {
            ScanForSpecialColorspaceUsage(cs.ChildLevel);
        }
        else if (content is SetFillColorSpace _cs)
        {
            ColorSpace _space = cs.Contents.ContentContext.Resources.ColorSpaces[_cs.Name];
            space = _space as SeparationColorSpace;
        }
        else if (content is SetDeviceCMYKFillColor || content is SetDeviceGrayFillColor || content is SetDeviceRGBFillColor)
        {
            space = null;
        }
        else if (content is DrawRectangle _dr)
        {
            if (space != null)
            {
                X = _dr.X;
                Y = _dr.Y;
                Width = _dr.Width;
                Height = _dr.Height;
            }
        }
        else if (content is PaintPath _pp)
        {
            if (space != null && _pp.Filled && (X != 0 || Y != 0 || Width != 0 || Height != 0))
            {
                String name = ((PdfName)((PdfArray)space.BaseDataObject)[1]).ToString();
                Console.WriteLine("Filling rectangle at {0}, {1} with size {2}x{3} using {4}", X, Y, Width, Height, name);
            }
            X = 0;
            Y = 0;
            Width = 0;
            Height = 0;
        }
    }
}

ВНИМАНИЕ: Это всего лишь доказательство концепции , максимально упрощенное для работы в вашем PDF для квадратов на снимке экрана выше.

Для общего решениявам придется значительно расширить это:

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

    Из такого потока контекста могут ссылаться другие потоки контента, например, форма XObject.Чтобы поймать все случаи использования интересных цветовых пространств в универсальном документе, вы также должны рекурсивно проверять такие зависимые потоки содержимого.

  • Код игнорирует текущую матрицу преобразования.

    Текущую матрицу преобразования можно изменить с помощью инструкции, чтобы все чертежи выполнялись, следуя инструкциям, их координаты изменяются в соответствии с аффинным преобразованием.Чтобы получить все координаты и размеры прямо в универсальном документе, необходимо применить к ним текущую матрицу преобразования.

  • Код игнорирует инструкции save-graphics-state / restore-graphics-state.

    Текущее графическое состояние (включая цвет заливки и текущую матрицу преобразования) может быть сохранено в стеке и восстановлено из него.Чтобы получить цвета, координаты и размеры прямо в стандартном документе, вы должны отслеживать сохраненные и восстановленные графические состояния (или использовать данные из cs.State для цвета и преобразования, где PDF Clown делает это за вас).

  • Код только смотрит на Разделение цветовые пространства.

    Если вас интересуют и другие цветовые пространства, вы должны обобщить это.

  • Код понимает только очень конкретные, тривиальные пути: только пути, сгенерированные одной инструкцией, определяющей прямоугольник.

    Для общего решения необходимо поддерживать произвольные пути.

...