Я хочу определить ColorSpace объекты в PDF и извлечь их местоположение (координаты, ширину и высоту цветового пространства) на странице.
Я предполагаюВы имеете в виду квадраты здесь:
Осторожно, это не 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 делает это за вас).
Код только смотрит на Разделение цветовые пространства.
Если вас интересуют и другие цветовые пространства, вы должны обобщить это.
Код понимает только очень конкретные, тривиальные пути: только пути, сгенерированные одной инструкцией, определяющей прямоугольник.
Для общего решения необходимо поддерживать произвольные пути.