Получение разрешения и размеров изображений
Следующий фрагмент кода также работает с библиотекой Aspose.PDF.Drawing.
Эта тема объясняет, как использовать классы операторов в пространстве имен Aspose.PDF, которые предоставляют возможность получать информацию о разрешении и размерах изображений, не извлекая их.
Существуют различные способы достижения этого. В этой статье объясняется, как использовать arraylist
и классы размещения изображений.
- Сначала загрузите исходный PDF-файл (с изображениями).
- Затем создайте объект ArrayList для хранения имен всех изображений в документе.
- Получите изображения, используя свойство Page.Resources.Images.
- Создайте объект стека для хранения графического состояния изображения и используйте его для отслеживания различных состояний изображений.
- Поскольку мы можем модифицировать матрицу с помощью ConcatenateMatrix, нам также может потребоваться вернуться к исходному состоянию изображения. Используйте операторы GSave и GRestore. Эти операторы используются парами и должны вызываться вместе. Например, если вы выполняете работу с графикой с использованием сложных трансформаций и в конечном итоге возвращаете трансформации в исходное состояние, подход будет следующим:
// Рисуем некоторый текст
GSave
ConcatenateMatrix // поворачиваем содержимое после оператора
// Некоторая графическая работа
ConcatenateMatrix // масштабируем (с предыдущим поворотом) содержимое после оператора
// Другая графическая работа
GRestore
// Рисуем некоторый текст
В результате текст рисуется в обычной форме, но между операторами текста выполняются некоторые трансформации. Для отображения изображения или для рисования форм объектов и изображений нам нужно использовать оператор Do.
У нас также есть класс с именем XImage, который предоставляет два свойства, Width и Height, которые можно использовать для получения размеров изображения.
- Отображение информации в командной строке вместе с именем изображения.
Следующий фрагмент кода показывает, как получить размеры и разрешение изображения, не извлекая его из документа PDF.
// Для полных примеров и файлов данных, пожалуйста, перейдите на https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// Путь к директории с документами.
string dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Загрузка исходного PDF файла
Document doc = new Document(dataDir+ "ImageInformation.pdf");
// Определение стандартного разрешения для изображения
int defaultResolution = 72;
System.Collections.Stack graphicsState = new System.Collections.Stack();
// Определение объекта списка, который будет содержать имена изображений
System.Collections.ArrayList imageNames = new System.Collections.ArrayList(doc.Pages[1].Resources.Images.Names);
// Вставка объекта в стек
graphicsState.Push(new System.Drawing.Drawing2D.Matrix(1, 0, 0, 1, 0, 0));
// Получение всех операторов на первой странице документа
foreach (Operator op in doc.Pages[1].Contents)
{
// Использование операторов GSave/GRestore для возврата преобразований к ранее установленным
Aspose.Pdf.Operators.GSave opSaveState = op as Aspose.Pdf.Operators.GSave;
Aspose.Pdf.Operators.GRestore opRestoreState = op as Aspose.Pdf.Operators.GRestore;
// Создание объекта ConcatenateMatrix, поскольку он определяет текущую матрицу преобразования.
Aspose.Pdf.Operators.ConcatenateMatrix opCtm = op as Aspose.Pdf.Operators.ConcatenateMatrix;
// Создание оператора Do, который рисует объекты из ресурсов. Он рисует объекты Form и объекты Image
Aspose.Pdf.Operators.Do opDo = op as Aspose.Pdf.Operators.Do;
if (opSaveState != null)
{
// Сохранение предыдущего состояния и помещение текущего состояния в верхнюю часть стека
graphicsState.Push(((System.Drawing.Drawing2D.Matrix)graphicsState.Peek()).Clone());
}
else if (opRestoreState != null)
{
// Отбрасывание текущего состояния и восстановление предыдущего
graphicsState.Pop();
}
else if (opCtm != null)
{
System.Drawing.Drawing2D.Matrix cm = new System.Drawing.Drawing2D.Matrix(
(float)opCtm.Matrix.A,
(float)opCtm.Matrix.B,
(float)opCtm.Matrix.C,
(float)opCtm.Matrix.D,
(float)opCtm.Matrix.E,
(float)opCtm.Matrix.F);
// Умножение текущей матрицы на матрицу состояния
((System.Drawing.Drawing2D.Matrix)graphicsState.Peek()).Multiply(cm);
continue;
}
else if (opDo != null)
{
// В случае, если это оператор рисования изображения
if (imageNames.Contains(opDo.Name))
{
System.Drawing.Drawing2D.Matrix lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
// Создание объекта XImage для хранения изображений первой страницы PDF
XImage image = doc.Pages[1].Resources.Images[opDo.Name];
// Получение размеров изображения
double scaledWidth = Math.Sqrt(Math.Pow(lastCTM.Elements[0], 2) + Math.Pow(lastCTM.Elements[1], 2));
double scaledHeight = Math.Sqrt(Math.Pow(lastCTM.Elements[2], 2) + Math.Pow(lastCTM.Elements[3], 2));
// Получение информации о высоте и ширине изображения
double originalWidth = image.Width;
double originalHeight = image.Height;
// Расчёт разрешения на основе полученной информации
double resHorizontal = originalWidth * defaultResolution / scaledWidth;
double resVertical = originalHeight * defaultResolution / scaledHeight;
// Отображение информации о размерах и разрешении каждого изображения
Console.Out.WriteLine(
string.Format(dataDir + "image {0} ({1:.##}:{2:.##}): res {3:.##} x {4:.##}",
opDo.Name, scaledWidth, scaledHeight, resHorizontal,
resVertical));
}
}
}