ทำงานกับ Canvas ภายใน XPS
ตัด (clip) และแปลง (transform) Canvas ในไฟล์ XPS โดยใช้ C++ API
ในไฟล์ XPS นั้น Canvas คือพื้นที่สี่เหลี่ยมบนหน้าเพจที่สามารถวาดเนื้อหาภาพ เช่น ข้อความ รูปภาพ และรูปทรง โดยทำหน้าที่เป็นตัวบรรจุสำหรับองค์ประกอบเหล่านี้และให้เฟรมเวิร์กสำหรับการจัดระเบียบและการแบ่งชั้น (layering) Canvas สามารถนำกลับมาใช้ใหม่ได้ในส่วนต่างๆ ของเอกสาร หรือแม้แต่ในเอกสารหลายฉบับ ซึ่งช่วยให้จัดโครงสร้างและจัดระเบียบเนื้อหาภายในเอกสาร XPS ได้อย่างยืดหยุ่น คุณสมบัติหลักของ Canvas ในไฟล์ XPS:
- Canvas สามารถซ้อน (nested) กันภายใน Canvas อื่นๆ ได้ ทำให้เกิดโครงสร้างลำดับชั้นที่ช่วยให้สร้างเลย์เอาต์ (layouts) ที่ซับซ้อนและจัดกลุ่มองค์ประกอบได้
- Canvas สามารถแปลง (transform) ได้โดยใช้การดำเนินการต่างๆ เช่น การเลื่อน (translation) การหมุน (rotation) และการปรับขนาด (scaling) ซึ่งช่วยให้วางตำแหน่งและปรับขนาดเนื้อหาได้อย่างยืดหยุ่น
- Canvas สามารถตัด (clip) ให้อยู่ในพื้นที่ที่ระบุได้ ซึ่งจะจำกัดพื้นที่ที่มองเห็นได้ของเนื้อหา สิ่งนี้มีประโยชน์สำหรับการสร้างรูปทรงและเอฟเฟกต์ที่ซับซ้อน
- Canvas สามารถประกอบด้วยองค์ประกอบภาพที่แตกต่างกันได้ รวมถึงการเรียกใช้ข้อความ (text runs) ย่อหน้า (paragraphs) และกล่องข้อความ (text boxes) นอกจากนี้ยังสามารถประกอบด้วยรูปภาพ รูปทรงเรขาคณิต และ Canvas อื่นๆ
การจัดการ Canvas ในเอกสารเป็นหนึ่งในคุณสมบัติที่ Aspose.Page สำหรับ C++ นำเสนอ โซลูชันนี้ทำงานร่วมกับภาษาคำอธิบายหน้าต่างๆ โดยเฉพาะ XPS
ในการแปลง (transform) Canvas ของไฟล์ XPS ให้ทำตามคู่มือด้านล่าง:
- สร้างไฟล์ XPS โดยใช้คลาส XpsDocument
- สร้าง Canvas หลักที่ใช้ร่วมกันสำหรับองค์ประกอบหน้าทั้งหมด โดยใช้เมธอด AddCanvas()
- สร้างออฟเซตซ้ายและบนใน Canvas หลักโดยใช้เมธอด CreateMatrix()
- สร้างรูปทรงเรขาคณิตเส้นทางสี่เหลี่ยม (rectangle path geometry) ด้วยเมธอด CreatePathGeometry()
- สร้างการเติม (fill) สำหรับสี่เหลี่ยมโดยใช้คลาส XpsBrush
- ในการสร้างสี่เหลี่ยมใน Canvas 2 และเติม ให้ใช้คลาส XpsPath
- ในการเลื่อน Canvas 3 เพื่อวางตำแหน่งสี่เหลี่ยมใหม่ด้านล่างสี่เหลี่ยมก่อนหน้า ให้ใช้เมธอด CreateMatrix()
- ในการเลื่อน Canvas นี้ไปทางด้านขวาของหน้า ให้ใช้เมธอด Translate()
- ในการปรับขนาด (scale) Canvas 4 ให้เรียกเมธอด Scale()
- ในการหมุน Canvas 5 รอบจุดหนึ่ง 45 องศา เมธอด RotateAround() จะช่วยได้
- บันทึกเอกสาร XPS ที่เปลี่ยนแปลงโดยใช้เมธอด XpsDocument.Save()
การแปลง Canvas (canvas transformation)
// The path to the documents directory.
System::String dataDir = RunExamples::GetDataDir_WorkingWithCanvas();
// Create new XPS Document
System::SharedPtr<XpsDocument> doc = System::MakeObject<XpsDocument>();
// Create main canvas, common for all page elemnts
System::SharedPtr<XpsCanvas> canvas1 = doc->AddCanvas();
// Make left and top offsets in the main canvas
canvas1->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 20.0f, 10.0f));
// Create rectangle path geometry
System::SharedPtr<XpsPathGeometry> rectGeom = doc->CreatePathGeometry(u"M 0,0 L 200,0 200,100 0,100 Z");
// Create a fill for rectangles
System::SharedPtr<XpsBrush> fill = doc->CreateSolidColorBrush(doc->CreateColor(12, 15, 159));
// Add new canvas without any transformations to the main canvas
System::SharedPtr<XpsCanvas> canvas2 = canvas1->AddCanvas();
// Create rectangle in this canvas and fill it
System::SharedPtr<XpsPath> rect = canvas2->AddPath(rectGeom);
rect->set_Fill(fill);
// Add new canvas with translate transformation to the main canvas
System::SharedPtr<XpsCanvas> canvas3 = canvas1->AddCanvas();
// Translate this canvas to position new rectangle below previous rectnagle
canvas3->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 200.0f));
// Translate this canvas to right side of page
canvas3->get_RenderTransform()->Translate(500.0f, 0.0f);
// Create rectangle in this canvas and fill it
rect = canvas3->AddPath(rectGeom);
rect->set_Fill(fill);
// Add new canvas with double scale transformation to the main canvas
System::SharedPtr<XpsCanvas> canvas4 = canvas1->AddCanvas();
// Translate this canvas to position new rectangle below previous rectnagle
canvas4->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 400.0f));
// Scale this canvas
canvas4->get_RenderTransform()->Scale(2.0f, 2.0f);
// Create rectangle in this canvas and fill it
rect = canvas4->AddPath(rectGeom);
rect->set_Fill(fill);
// Add new canvas with rotation around a point transformation to the main canvas
System::SharedPtr<XpsCanvas> canvas5 = canvas1->AddCanvas();
// Translate this canvas to position new rectangle below previous rectnagle
canvas5->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 800.0f));
// Rotate this canvas aroud a point on 45 degrees
canvas5->get_RenderTransform()->RotateAround(45.0f, System::Drawing::PointF(100.0f, 50.0f));
rect = canvas5->AddPath(rectGeom);
rect->set_Fill(fill);
// Save resultant XPS document
doc->Save(dataDir + u"output/" + u"output1.xps");ในการตัด (clip) Canvas ของไฟล์ XPS ให้ทำตามคู่มือด้านล่าง:
- สร้างหรือเปิดไฟล์ XPS โดยใช้คลาส XpsDocument
- สร้าง Canvas หลักที่ใช้ร่วมกันสำหรับองค์ประกอบหน้าทั้งหมด โดยใช้เมธอด AddCanvas()
- สร้างออฟเซตซ้ายและบนใน Canvas หลักโดยใช้เมธอด CreateMatrix()
- สร้างรูปทรงเรขาคณิตเส้นทางสี่เหลี่ยมด้วยเมธอด CreatePathGeometry()
- สร้างการเติมสำหรับสี่เหลี่ยมโดยใช้คลาส XpsBrush
- ในการเพิ่ม Canvas อื่นพร้อม Clip ไปยัง Canvas หลัก ให้เรียกเมธอด AddCanvas() อีกครั้ง
- สร้างรูปทรงเรขาคณิตวงกลมสำหรับ Clip โดยใช้คลาส XpsPathGeometry
- ในการสร้างสี่เหลี่ยมใน Canvas นี้และเติม ให้ใช้คลาส XpsPath
- เพิ่ม Canvas อื่นด้วยเมธอด AddCanvas() จากนั้นสร้างสี่เหลี่ยมใน Canvas นี้และลากเส้น (stroke) ด้วยคลาส XpsPathGeometry
- บันทึกเอกสาร XPS ที่เปลี่ยนแปลงโดยใช้เมธอด XpsDocument.Save()
การตัด Canvas (canvas clipping)
// The path to the documents directory.
System::String dataDir = RunExamples::GetDataDir_WorkingWithCanvas();
// Create new XPS Document
System::SharedPtr<XpsDocument> doc = System::MakeObject<XpsDocument>();
// Create main canvas, common for all page elemnts
System::SharedPtr<XpsCanvas> canvas1 = doc->AddCanvas();
// Make left and top offsets in the main canvas
canvas1->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 20.0f, 10.0f));
// Create rectangle path geometry
System::SharedPtr<XpsPathGeometry> rectGeom = doc->CreatePathGeometry(u"M 0,0 L 500,0 500,300 0,300 Z");
// Create a fill for rectangles
System::SharedPtr<XpsBrush> fill = doc->CreateSolidColorBrush(doc->CreateColor(12, 15, 159));
// Add another canvas with clip to the main canvas
System::SharedPtr<XpsCanvas> canvas2 = canvas1->AddCanvas();
// Create circle geometry for clip
System::SharedPtr<XpsPathGeometry> clipGeom = doc->CreatePathGeometry(u"M250,250 A100,100 0 1 1 250,50 100,100 0 1 1 250,250");
canvas2->set_Clip(clipGeom);
// Create rectangle in this canvas and fill it
System::SharedPtr<XpsPath> rect = canvas2->AddPath(rectGeom);
rect->set_Fill(fill);
// Add the second canvas with stroked rectangle to the main canvas
System::SharedPtr<XpsCanvas> canvas3 = canvas1->AddCanvas();
// Create rectangle in this canvas and stroke it
rect = canvas3->AddPath(rectGeom);
rect->set_Stroke(fill);
rect->set_StrokeThickness(2.0f);
// Save resultant XPS document
doc->Save(dataDir + u"output/" + u"output2.xps");
XPS XPS รูปแบบไฟล์คืออะไร
XPS (XML Paper Specification) เป็นรูปแบบทางเลือกของ Microsoft ต่อ PDF พื้นฐานบน XML/HTML รักษาเลย์เอาต์ข้ามแพลตฟอร์มและไม่ขึ้นกับระบบปฏิบัติการ