Szegély kibontása PDF fájlból

Ebben az oktatóanyagban megtudjuk, hogyan lehet kivonni a szegélyt PDF-fájlból az Aspose.PDF for .NET segítségével. Lépésről lépésre elmagyarázzuk a forráskódot C# nyelven. Ennek az oktatóanyagnak a végén tudni fogja, hogyan bontsa ki a szegélyt egy PDF-dokumentumból, és hogyan mentse el képként. Kezdjük!

1. lépés: A környezet beállítása

Először is győződjön meg arról, hogy beállította C# fejlesztői környezetét az Aspose.PDF for .NET segítségével. Adja hozzá a hivatkozást a könyvtárhoz, és importálja a szükséges névtereket.

2. lépés: A PDF-dokumentum betöltése

Ebben a lépésben betöltjük a PDF dokumentumot a megadott fájlból.

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

Feltétlenül cserélje ki a „DOKUMENTUMKÖNYVTÁR” elemet arra a könyvtárra, ahol a PDF-fájl található.

3. lépés: Élek kivonása

A szegélyt kivonjuk a PDF dokumentumból a dokumentumban szereplő műveletek iterációjával.

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))
{
     // Az összes tartalomművelet feldolgozása
     foreach(Operator op in doc.Pages[1].Contents)
     {
         // Ellenőrizze a művelet típusát
         // ...
         // Adjon hozzá kódot az egyes műveletek feldolgozásához
     }
}

Létrehozunk agraphicsState verem a grafikai állapotok tárolásához, bittérképes kép a kivont szegély rögzítéséhez, aGraphicsPath objektum a rajzi útvonalak tárolására, és egyéb változók az állapot és a színek nyomon követésére.

4. lépés: Tranzakció feldolgozása

Ebben a lépésben feldolgozzuk a dokumentum minden egyes műveletét a szegély kibontásához.

// Ellenőrizze a művelet típusát
if (opSaveState != null)
{
     // Mentse el az előző állapotot, és tolja az aktuális állapotot a verem tetejére
     graphicsState.Push(((System.Drawing.Drawing2D.Matrix)graphicsState.Peek()).Clone());
     lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
}
else if (opRestoreState != null)
{
     // Törölje az aktuális állapotot és állítsa vissza az előző állapotot
     graphicsState. Pop();
     lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
}
else if (opCtm != null)
{
     // Az aktuális transzformációs mátrix lekérése
     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);

     // Szorozzuk meg az aktuális mátrixot az állapotmátrixszal
     ((System.Drawing.Drawing2D.Matrix)graphicsState.Peek()).Multiply(cm);
     lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
}
else if (opMoveTo != null)
{
     // Frissítse az utolsó rajzpontot
     lastPoint = new System.Drawing.PointF((float)opMoveTo.X, (float)opMoveTo.Y);
}
else if (opLineTo != null)
{
     // Egy vonal rajzolásának feldolgozása
     // ...
     // Adjon hozzá kódot a vonal rajzolásához
}
// ...
// Adjon hozzá else if blokkokat más műveletekhez

Feltételekkel ellenőrizzük a művelet típusát, és minden művelethez lefuttatjuk a megfelelő kódot.

5. lépés: Biztonsági kép

Végül elmentjük a kibontott szegélyt tartalmazó bittérképes képet egy megadott fájlba.

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

Ügyeljen arra, hogy a megfelelő könyvtárat és fájlnevet adja meg a kimeneti kép mentéséhez.

Példa forráskód az Extract Borderhez az Aspose.PDF for .NET használatával

// A dokumentumok könyvtárának elérési útja.
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();
// Az alapértelmezett ctm-mátrix értéke 1,0,0,1,0,0
System.Drawing.Drawing2D.Matrix lastCTM = new System.Drawing.Drawing2D.Matrix(1, 0, 0, -1, 0, 0);
// System.Drawing koordinátarendszer bal felső alapú, míg a pdf koordinátarendszer bal alsó alapú, ezért az inverziós mátrixot kell alkalmaznunk
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));

	// Feldolgozza az összes tartalom parancsot
	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)
		{
			//Mentse el az előző állapotot, és tolja a jelenlegi állapotot a verem tetejére
			graphicsState.Push(((System.Drawing.Drawing2D.Matrix)graphicsState.Peek()).Clone());
			lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
		}
		else if (opRestoreState != null)
		{
			// Dobja el a jelenlegi állapotot, és állítsa vissza az előzőt
			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);

			// Szorozzuk meg az árammátrixot az állapotmátrixszal
			((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);

Következtetés

Ebben az oktatóanyagban megtanultuk, hogyan lehet szegélyt kivonni egy PDF-dokumentumból az Aspose.PDF for .NET használatával. Ezzel a lépésenkénti útmutatóval szegélyt vonhat ki más PDF-dokumentumokból.

GYIK a szegély kivonásához PDF-fájlban

K: Mi a célja a szegély kibontásának egy PDF-fájlból?

V: A szegély kibontása egy PDF-fájlból különféle célokra hasznos lehet. Lehetővé teszi a dokumentum szerkezeti elemeinek, például táblázatok, diagramok vagy grafikus elemek elkülönítését és elemzését. A kibontott szegély segítségével azonosíthatja a PDF-dokumentumban lévő tartalom elrendezését, méreteit és elhelyezését.

K: Kivonhatom a szegélyt a PDF-dokumentum bizonyos oldalairól vagy területeiről?

V: Igen, módosíthatja a mellékelt C# forráskódot, hogy kivonja a szegélyt a PDF dokumentum bizonyos oldalairól vagy régióiról. Manipulálásával adoc.Pages gyűjtemény és egyéni feltételek megadásával kiválaszthatja, hogy kivonja a szegélyt bizonyos oldalakról vagy érdeklődési területekről.

K: Hogyan szabhatom testre a kimeneti képformátumot és minőséget?

V: A mellékelt C# kódban a kibontott szegély PNG-képként kerül mentésre. Ha módosítani szeretné a kimeneti képformátumot, módosíthatja aImageFormat.Png paraméter abitmap.Save módszert más támogatott képformátumokhoz, például JPEG, BMP vagy GIF. Ezenkívül igénye szerint módosíthatja a képminőséget vagy a tömörítési beállításokat.

K: Milyen egyéb műveleteket hajthatok végre a kibontott határon?

V: Miután kibontotta a szegélyt képként, tovább dolgozhatja azt képfeldolgozó könyvtárak vagy algoritmusok segítségével. Szükség esetén elemezheti a képet, alkalmazhat képszűrőket, észlelheti a mintákat, vagy OCR-t (optikai karakterfelismerést) hajthat végre, hogy szöveget vonjon ki a képből.

K: Vannak-e korlátozások vagy megfontolások az összetett PDF-dokumentumok szegélyeinek kivonásakor?

V: A kibontási folyamat a PDF-dokumentum összetettségétől függően változhat. A többrétegű, átlátszó vagy fejlett grafikával rendelkező összetett PDF-fájlok további feldolgozást vagy módosításokat igényelhetnek a szegély pontos kibontása érdekében. Elengedhetetlen, hogy alaposan tesztelje a kinyerési folyamatot különböző PDF-dokumentumokon a megbízható eredmények érdekében.