Извлечь границу из PDF-файла

В этом уроке мы узнаем, как извлечь границу в PDF-файле с помощью Aspose.PDF для .NET. Мы объясним исходный код на C# шаг за шагом. В конце этого урока вы узнаете, как извлечь рамку из PDF-документа и сохранить ее как изображение. Давайте начнем!

Шаг 1. Настройка среды

Сначала убедитесь, что вы настроили свою среду разработки C# с помощью Aspose.PDF для .NET. Добавьте ссылку на библиотеку и импортируйте необходимые пространства имен.

Шаг 2. Загрузка PDF-документа

На этом этапе мы загружаем PDF-документ из указанного файла.

Document doc = new Document(dataDir + "input.pdf");

Обязательно замените «КАТАЛОГ ВАШЕГО ДОКУМЕНТА» на фактический каталог, в котором находится ваш PDF-файл.

Шаг 3: Извлечение краев

Мы извлечем границу из PDF-документа, перебирая операции, содержащиеся в документе.

Stack graphicsState = new Stack();
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap((int)doc.Pages[1].PageInfo.Width, (int)doc.Pages[1].PageInfo.Height);
System.Drawing.Drawing2D.GraphicsPath graphicsPath = new System.Drawing.Drawing2D.GraphicsPath();
System.Drawing.Drawing2D.Matrix lastCTM = new System.Drawing.Drawing2D.Matrix(1, 0, 0, -1, 0, 0);
System.Drawing.Drawing2D.Matrix inversionMatrix = new System.Drawing.Drawing2D.Matrix(1, 0, 0, -1, 0, (float)doc.Pages[1].PageInfo.Height);
System.Drawing.PointF lastPoint = new System.Drawing.PointF(0, 0);
System.Drawing.Color fillColor = System.Drawing.Color.FromArgb(0, 0, 0);
System.Drawing.Color strokeColor = System.Drawing.Color.FromArgb(0, 0, 0);

using (System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(bitmap))
{
     // Обрабатывать все операции с контентом
     foreach(Operator op in doc.Pages[1].Contents)
     {
         // Проверьте тип операции
         // ...
         // Добавьте код для обработки каждой операции
     }
}

Мы создаемgraphicsState стек для хранения графических состояний, растровое изображение для захвата извлеченной границы,GraphicsPath объект для хранения путей рисования и другие переменные для отслеживания состояния и цветов.

Шаг 4: Обработка транзакции

На этом этапе мы обрабатываем каждую операцию документа для извлечения границы.

// Проверьте тип операции
if (opSaveState != null)
{
     // Сохраните предыдущее состояние и поместите текущее состояние на вершину стека.
     graphicsState.Push(((System.Drawing.Drawing2D.Matrix)graphicsState.Peek()).Clone());
     lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
}
else if (opRestoreState != null)
{
     // Удалить текущее состояние и восстановить предыдущее состояние
     graphicsState. Pop();
     lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
}
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);
     lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
}
else if (opMoveTo != null)
{
     // Обновить последнюю точку рисования
     lastPoint = new System.Drawing.PointF((float)opMoveTo.X, (float)opMoveTo.Y);
}
else if (opLineTo != null)
{
     // Обработка рисования линии
     // ...
     // Добавьте код для обработки рисования линии
}
// ...
// Добавьте else if блоки для других операций

Мы проверяем тип операции с помощью условий и запускаем соответствующий код для каждой операции.

Шаг 5: Резервное изображение

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

dataDir = dataDir + "ExtractBorder_out.png";
bitmap.Save(dataDir, ImageFormat.Png);

Обязательно укажите правильный каталог и имя файла для сохранения выходного изображения.

Пример исходного кода для извлечения границы с использованием Aspose.PDF для .NET

// Путь к каталогу документов.
string dataDir = "YOUR DOCUMENT DIRECTORY";

Document doc = new Document(dataDir + "input.pdf");

Stack graphicsState = new Stack();
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap((int)doc.Pages[1].PageInfo.Width, (int)doc.Pages[1].PageInfo.Height);
System.Drawing.Drawing2D.GraphicsPath graphicsPath = new System.Drawing.Drawing2D.GraphicsPath();
// Значение матрицы ctm по умолчанию — 1,0,0,1,0,0.
System.Drawing.Drawing2D.Matrix lastCTM = new System.Drawing.Drawing2D.Matrix(1, 0, 0, -1, 0, 0);
//Система координат System.Drawing основана на левом верхнем углу, а система координат PDF — на нижнем левом углу, поэтому нам нужно применить матрицу инверсии.
System.Drawing.Drawing2D.Matrix inversionMatrix = new System.Drawing.Drawing2D.Matrix(1, 0, 0, -1, 0, (float)doc.Pages[1].PageInfo.Height);
System.Drawing.PointF lastPoint = new System.Drawing.PointF(0, 0);
System.Drawing.Color fillColor = System.Drawing.Color.FromArgb(0, 0, 0);
System.Drawing.Color strokeColor = System.Drawing.Color.FromArgb(0, 0, 0);

using (System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(bitmap))
{
	gr.SmoothingMode = SmoothingMode.HighQuality;
	graphicsState.Push(new System.Drawing.Drawing2D.Matrix(1, 0, 0, 1, 0, 0));

	// Обработать все команды содержимого
	foreach (Operator op in doc.Pages[1].Contents)
	{
		Aspose.Pdf.Operators.GSave opSaveState = op as Aspose.Pdf.Operators.GSave;
		Aspose.Pdf.Operators.GRestore opRestoreState = op as Aspose.Pdf.Operators.GRestore;
		Aspose.Pdf.Operators.ConcatenateMatrix opCtm = op as Aspose.Pdf.Operators.ConcatenateMatrix;
		Aspose.Pdf.Operators.MoveTo opMoveTo = op as Aspose.Pdf.Operators.MoveTo;
		Aspose.Pdf.Operators.LineTo opLineTo = op as Aspose.Pdf.Operators.LineTo;
		Aspose.Pdf.Operators.Re opRe = op as Aspose.Pdf.Operators.Re;
		Aspose.Pdf.Operators.EndPath opEndPath = op as Aspose.Pdf.Operators.EndPath;
		Aspose.Pdf.Operators.Stroke opStroke = op as Aspose.Pdf.Operators.Stroke;
		Aspose.Pdf.Operators.Fill opFill = op as Aspose.Pdf.Operators.Fill;
		Aspose.Pdf.Operators.EOFill opEOFill = op as Aspose.Pdf.Operators.EOFill;
		Aspose.Pdf.Operators.SetRGBColor opRGBFillColor = op as Aspose.Pdf.Operators.SetRGBColor;
		Aspose.Pdf.Operators.SetRGBColorStroke opRGBStrokeColor = op as Aspose.Pdf.Operators.SetRGBColorStroke;

		if (opSaveState != null)
		{
			//Сохраните предыдущее состояние и поместите текущее состояние в начало стека.
			graphicsState.Push(((System.Drawing.Drawing2D.Matrix)graphicsState.Peek()).Clone());
			lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
		}
		else if (opRestoreState != null)
		{
			// Выбросить текущее состояние и восстановить предыдущее
			graphicsState.Pop();
			lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
		}
		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);
			lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
		}
		else if (opMoveTo != null)
		{
			lastPoint = new System.Drawing.PointF((float)opMoveTo.X, (float)opMoveTo.Y);
		}
		else if (opLineTo != null)
		{
			System.Drawing.PointF linePoint = new System.Drawing.PointF((float)opLineTo.X, (float)opLineTo.Y);
			graphicsPath.AddLine(lastPoint, linePoint);

			lastPoint = linePoint;
		}
		else if (opRe != null)
		{
			System.Drawing.RectangleF re = new System.Drawing.RectangleF((float)opRe.X, (float)opRe.Y, (float)opRe.Width, (float)opRe.Height);
			graphicsPath.AddRectangle(re);
		}
		else if (opEndPath != null)
		{
			graphicsPath = new System.Drawing.Drawing2D.GraphicsPath();
		}
		else if (opRGBFillColor != null)
		{
			fillColor = opRGBFillColor.getColor();
		}
		else if (opRGBStrokeColor != null)
		{
			strokeColor = opRGBStrokeColor.getColor();
		}
		else if (opStroke != null)
		{
			graphicsPath.Transform(lastCTM);
			graphicsPath.Transform(inversionMatrix);
			gr.DrawPath(new System.Drawing.Pen(strokeColor), graphicsPath);
			graphicsPath = new System.Drawing.Drawing2D.GraphicsPath();
		}
		else if (opFill != null)
		{
			graphicsPath.FillMode = FillMode.Winding;
			graphicsPath.Transform(lastCTM);
			graphicsPath.Transform(inversionMatrix);
			gr.FillPath(new System.Drawing.SolidBrush(fillColor), graphicsPath);
			graphicsPath = new System.Drawing.Drawing2D.GraphicsPath();
		}
		else if (opEOFill != null)
		{
			graphicsPath.FillMode = FillMode.Alternate;
			graphicsPath.Transform(lastCTM);
			graphicsPath.Transform(inversionMatrix);
			gr.FillPath(new System.Drawing.SolidBrush(fillColor), graphicsPath);
			graphicsPath = new System.Drawing.Drawing2D.GraphicsPath();
		}
	}
}
dataDir = dataDir + "ExtractBorder_out.png";
bitmap.Save(dataDir, ImageFormat.Png);

Console.WriteLine("\nBorder extracted successfully as image.\nFile saved at " + dataDir);

Заключение

В этом уроке мы узнали, как извлечь рамку из PDF-документа с помощью Aspose.PDF для .NET. Вы можете использовать это пошаговое руководство, чтобы извлечь рамку из других PDF-документов.

Часто задаваемые вопросы по извлечению границы в PDF-файле

Вопрос: Какова цель извлечения границы из PDF-файла?

О: Извлечение границы из PDF-файла может быть полезно для различных целей. Он позволяет изолировать и анализировать структурные элементы документа, такие как таблицы, диаграммы или графические элементы. Вы можете использовать извлеченную рамку, чтобы определить макет, размеры и расположение содержимого в PDF-документе.

Вопрос: Могу ли я извлечь рамку из определенных страниц или областей PDF-документа?

О: Да, вы можете изменить предоставленный исходный код C#, чтобы извлечь границу из определенных страниц или областей PDF-документа. Манипулируяdoc.Pages сбора и указания пользовательских критериев, вы можете выбрать выделение границы из определенных страниц или областей, представляющих интерес.

Вопрос: Как настроить формат и качество выходного изображения?

О: В предоставленном коде C# извлеченная граница сохраняется как изображение PNG. Если вы хотите изменить формат выходного изображения, вы можете изменитьImageFormat.Png параметр вbitmap.Save в другие поддерживаемые форматы изображений, такие как JPEG, BMP или GIF. Кроме того, вы можете настроить качество изображения или параметры сжатия в соответствии с вашими требованиями.

Вопрос: Какие еще операции можно выполнить с выделенной границей?

О: После того как вы извлекли границу в виде изображения, вы можете дополнительно обработать ее с помощью библиотек или алгоритмов обработки изображений. Вы можете анализировать изображение, применять фильтры изображений, обнаруживать шаблоны или выполнять OCR (оптическое распознавание символов), чтобы при необходимости извлечь текст из изображения.

Вопрос: Существуют ли какие-либо ограничения или соображения при извлечении границ из сложных PDF-документов?

О: Процесс извлечения может различаться в зависимости от сложности PDF-документа. Сложные PDF-файлы с несколькими слоями, прозрачностью или расширенной графикой могут потребовать дополнительной обработки или корректировок для точного выделения границы. Очень важно тщательно протестировать процесс извлечения различных PDF-документов, чтобы обеспечить надежные результаты.