Rahmen in PDF-Datei extrahieren
In diesem Tutorial lernen wir, wie man mit Aspose.PDF für .NET den Rahmen in einer PDF-Datei extrahiert. Wir erklären den Quellcode in C# Schritt für Schritt. Am Ende dieses Tutorials wissen Sie, wie Sie den Rahmen aus einem PDF-Dokument extrahieren und als Bild speichern. Fangen wir an!
Schritt 1: Einrichten der Umgebung
Stellen Sie zunächst sicher, dass Sie Ihre C#-Entwicklungsumgebung mit Aspose.PDF für .NET eingerichtet haben. Fügen Sie den Verweis auf die Bibliothek hinzu und importieren Sie die erforderlichen Namespaces.
Schritt 2: Laden des PDF-Dokuments
In diesem Schritt laden wir das PDF-Dokument aus der angegebenen Datei.
Document doc = new Document(dataDir + "input.pdf");
Ersetzen Sie „IHR DOKUMENTVERZEICHNIS“ unbedingt durch das tatsächliche Verzeichnis, in dem sich Ihre PDF-Datei befindet.
Schritt 3: Kantenextraktion
Wir extrahieren den Rand aus dem PDF-Dokument, indem wir die im Dokument enthaltenen Operationen durchlaufen.
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))
{
// Verarbeiten aller Inhaltsvorgänge
foreach(Operator op in doc.Pages[1].Contents)
{
// Überprüfen Sie die Art der Operation
// ...
// Fügen Sie Code hinzu, um jeden Vorgang zu verarbeiten
}
}
Wir schaffen einegraphicsState
Stapel zum Speichern von Grafikzuständen, ein Bitmap-Bild zum Erfassen des extrahierten Rahmens, einGraphicsPath
Objekt zum Speichern von Zeichenpfaden und anderen Variablen zum Verfolgen von Status und Farben.
Schritt 4: Transaktionsverarbeitung
In diesem Schritt verarbeiten wir jeden Vorgang des Dokuments, um die Grenze zu extrahieren.
// Überprüfen Sie die Art der Operation
if (opSaveState != null)
{
// Speichern Sie den vorherigen Status und verschieben Sie den aktuellen Status an den Anfang des Stapels
graphicsState.Push(((System.Drawing.Drawing2D.Matrix)graphicsState.Peek()).Clone());
lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
}
else if (opRestoreState != null)
{
// Den aktuellen Zustand löschen und den vorherigen Zustand wiederherstellen
graphicsState. Pop();
lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
}
else if (opCtm != null)
{
// Abrufen der aktuellen Transformationsmatrix
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);
// Multiplizieren Sie die aktuelle Matrix mit der Zustandsmatrix
((System.Drawing.Drawing2D.Matrix)graphicsState.Peek()).Multiply(cm);
lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
}
else if (opMoveTo != null)
{
// Den letzten Zeichenpunkt aktualisieren
lastPoint = new System.Drawing.PointF((float)opMoveTo.X, (float)opMoveTo.Y);
}
else if (opLineTo != null)
{
// Verarbeiten Sie das Zeichnen einer Linie
// ...
// Fügen Sie Code zum Zeichnen einer Linie hinzu
}
// ...
// Fügen Sie „else if“-Blöcke für andere Vorgänge hinzu
Wir prüfen die Art der Operation anhand von Bedingungen und führen für jede Operation den entsprechenden Code aus.
Schritt 5: Backup-Image
Schließlich speichern wir das Bitmap-Bild mit dem extrahierten Rand in einer angegebenen Datei.
dataDir = dataDir + "ExtractBorder_out.png";
bitmap.Save(dataDir, ImageFormat.Png);
Geben Sie unbedingt das richtige Verzeichnis und den richtigen Dateinamen an, um das Ausgabebild zu speichern.
Beispielquellcode zum Extrahieren von Rändern mit Aspose.PDF für .NET
// Der Pfad zum Dokumentverzeichnis.
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();
// Der Standardwert der CTM-Matrix ist 1,0,0,1,0,0
System.Drawing.Drawing2D.Matrix lastCTM = new System.Drawing.Drawing2D.Matrix(1, 0, 0, -1, 0, 0);
//Das Koordinatensystem von System.Drawing ist oben links ausgerichtet, während das Koordinatensystem von PDF unten links ausgerichtet ist. Daher müssen wir die Inversionsmatrix anwenden.
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));
// Verarbeiten Sie alle Inhaltsbefehle
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)
{
// Vorherigen Status speichern und aktuellen Status an den Anfang des Stapels verschieben
graphicsState.Push(((System.Drawing.Drawing2D.Matrix)graphicsState.Peek()).Clone());
lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
}
else if (opRestoreState != null)
{
// Aktuellen Zustand verwerfen und vorherigen wiederherstellen
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);
// Aktuelle Matrix mit der Zustandsmatrix multiplizieren
((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);
Abschluss
In diesem Tutorial haben wir gelernt, wie man mit Aspose.PDF für .NET den Rahmen aus einem PDF-Dokument extrahiert. Mit dieser Schritt-für-Schritt-Anleitung können Sie auch Rahmen aus anderen PDF-Dokumenten extrahieren.
FAQs zum Extrahieren von Rändern in PDF-Dateien
F: Was ist der Zweck des Extrahierens des Rahmens aus einer PDF-Datei?
A: Das Extrahieren des Rahmens aus einer PDF-Datei kann für verschiedene Zwecke nützlich sein. Sie können damit die Strukturelemente des Dokuments, wie Tabellen, Diagramme oder grafische Elemente, isolieren und analysieren. Anhand des extrahierten Rahmens können Sie das Layout, die Abmessungen und die Positionierung des Inhalts im PDF-Dokument ermitteln.
F: Kann ich den Rahmen aus bestimmten Seiten oder Bereichen im PDF-Dokument extrahieren?
A: Ja, Sie können den bereitgestellten C#-Quellcode ändern, um den Rahmen aus bestimmten Seiten oder Bereichen innerhalb des PDF-Dokuments zu extrahieren. Durch die Manipulation desdoc.Pages
Mithilfe der Sammlung und der Angabe benutzerdefinierter Kriterien können Sie den Rahmen aus bestimmten Seiten oder Interessensbereichen extrahieren.
F: Wie kann ich das Ausgabebildformat und die Qualität anpassen?
A: Im bereitgestellten C#-Code wird der extrahierte Rahmen als PNG-Bild gespeichert. Wenn Sie das Ausgabebildformat ändern möchten, können Sie Folgendes ändern:ImageFormat.Png
Parameter imbitmap.Save
Methode auf andere unterstützte Bildformate wie JPEG, BMP oder GIF. Darüber hinaus können Sie die Bildqualität oder Komprimierungseinstellungen entsprechend Ihren Anforderungen anpassen.
F: Welche anderen Vorgänge kann ich an der extrahierten Grenze durchführen?
A: Sobald Sie den Rahmen als Bild extrahiert haben, können Sie ihn mit Bildverarbeitungsbibliotheken oder -algorithmen weiterverarbeiten. Sie können das Bild analysieren, Bildfilter anwenden, Muster erkennen oder bei Bedarf OCR (Optical Character Recognition) durchführen, um Text aus dem Bild zu extrahieren.
F: Gibt es beim Extrahieren von Rändern aus komplexen PDF-Dokumenten irgendwelche Einschränkungen oder Überlegungen?
A: Der Extraktionsprozess kann je nach Komplexität des PDF-Dokuments variieren. Komplexe PDFs mit mehreren Ebenen, Transparenz oder erweiterten Grafiken erfordern möglicherweise zusätzliche Verarbeitung oder Anpassungen, um den Rand genau zu extrahieren. Es ist wichtig, den Extraktionsprozess an verschiedenen PDF-Dokumenten gründlich zu testen, um zuverlässige Ergebnisse sicherzustellen.