แยกเส้นขอบในไฟล์ 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);

อย่าลืมระบุไดเร็กทอรีและชื่อไฟล์ที่ถูกต้องเพื่อบันทึกอิมเมจเอาต์พุต

ตัวอย่างซอร์สโค้ดสำหรับ Extract Border โดยใช้ 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.ระบบพิกัดการวาดจะอิงด้านซ้ายบน ในขณะที่ระบบพิกัด 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 ต่างๆ อย่างละเอียดเพื่อให้แน่ใจว่าได้ผลลัพธ์ที่เชื่อถือได้