การแยกเส้นขอบออกจากไฟล์ 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)
{
// กระบวนการวาดเส้น
// -
// เพิ่มโค้ดสำหรับจัดการการวาดเส้น
}
// -
// เพิ่มบล็อคอื่น ๆ สำหรับการดำเนินการอื่น ๆ
เราตรวจสอบประเภทการดำเนินการโดยใช้เงื่อนไขและรันโค้ดที่เหมาะสมสำหรับการดำเนินการแต่ละอย่าง
ขั้นตอนที่ 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 คืออะไร
A: การแยกเส้นขอบออกจากไฟล์ PDF สามารถเป็นประโยชน์ได้หลายประการ โดยช่วยให้คุณสามารถแยกและวิเคราะห์องค์ประกอบโครงสร้างของเอกสาร เช่น ตาราง ไดอะแกรม หรือองค์ประกอบกราฟิก คุณสามารถใช้เส้นขอบที่แยกออกมาเพื่อระบุเค้าโครง ขนาด และตำแหน่งของเนื้อหาภายในเอกสาร PDF
ถาม: ฉันสามารถแยกเส้นขอบจากหน้าหรือพื้นที่เฉพาะในเอกสาร PDF ได้หรือไม่
A: ใช่ คุณสามารถแก้ไขโค้ดต้นฉบับ C# ที่ให้มาเพื่อแยกเส้นขอบจากหน้าหรือภูมิภาคเฉพาะภายในเอกสาร PDF ได้ โดยการจัดการdoc.Pages
เมื่อรวบรวมและระบุเกณฑ์ที่กำหนดเองแล้ว คุณสามารถเลือกที่จะแยกเส้นขอบจากหน้าหรือพื้นที่ที่สนใจโดยเฉพาะได้
ถาม: ฉันจะปรับแต่งรูปแบบและคุณภาพของภาพเอาท์พุตได้อย่างไร
A: ในโค้ด C# ที่ให้มา ขอบที่แยกออกมาจะถูกบันทึกเป็นรูปภาพ PNG หากคุณต้องการเปลี่ยนรูปแบบรูปภาพเอาต์พุต คุณสามารถแก้ไขImageFormat.Png
พารามิเตอร์ในbitmap.Save
วิธีการแปลงไฟล์ภาพที่รองรับรูปแบบอื่น เช่น JPEG, BMP หรือ GIF นอกจากนี้ คุณยังสามารถปรับคุณภาพของภาพหรือการตั้งค่าการบีบอัดได้ตามความต้องการของคุณ
ถาม: ฉันสามารถดำเนินการอื่นใดกับพรมแดนที่ถูกแยกออกมาได้บ้าง?
A: เมื่อคุณแยกเส้นขอบออกมาเป็นภาพแล้ว คุณสามารถประมวลผลเพิ่มเติมโดยใช้ไลบรารีหรืออัลกอริทึมการประมวลผลภาพ คุณสามารถวิเคราะห์ภาพ ใช้ฟิลเตอร์ภาพ ตรวจจับรูปแบบ หรือดำเนินการ OCR (การจดจำอักขระด้วยแสง) เพื่อแยกข้อความออกจากภาพหากจำเป็น
ถาม: มีข้อจำกัดหรือข้อควรพิจารณาใดๆ เมื่อแยกขอบออกจากเอกสาร PDF ที่ซับซ้อนหรือไม่
A: กระบวนการแยกไฟล์อาจแตกต่างกันไป ขึ้นอยู่กับความซับซ้อนของเอกสาร PDF ไฟล์ PDF ที่ซับซ้อนที่มีหลายเลเยอร์ ความโปร่งใส หรือกราฟิกขั้นสูงอาจต้องใช้การประมวลผลเพิ่มเติมหรือการปรับแต่งเพื่อแยกขอบได้อย่างแม่นยำ จำเป็นต้องทดสอบกระบวนการแยกไฟล์อย่างละเอียดในเอกสาร PDF ต่างๆ เพื่อให้แน่ใจว่าจะได้ผลลัพธ์ที่เชื่อถือได้