ทำงานกับ 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 ให้ทำตามคู่มือด้านล่าง:

  1. สร้างไฟล์ XPS โดยใช้คลาส XpsDocument
  2. สร้าง Canvas หลักที่ใช้ร่วมกันสำหรับองค์ประกอบหน้าทั้งหมด โดยใช้เมธอด AddCanvas()
  3. สร้างออฟเซตซ้ายและบนใน Canvas หลักโดยใช้เมธอด CreateMatrix()
  4. สร้างรูปทรงเรขาคณิตเส้นทางสี่เหลี่ยม (rectangle path geometry) ด้วยเมธอด CreatePathGeometry()
  5. สร้างการเติม (fill) สำหรับสี่เหลี่ยมโดยใช้คลาส XpsBrush
  6. ในการสร้างสี่เหลี่ยมใน Canvas 2 และเติม ให้ใช้คลาส XpsPath
  7. ในการเลื่อน Canvas 3 เพื่อวางตำแหน่งสี่เหลี่ยมใหม่ด้านล่างสี่เหลี่ยมก่อนหน้า ให้ใช้เมธอด CreateMatrix()
  8. ในการเลื่อน Canvas นี้ไปทางด้านขวาของหน้า ให้ใช้เมธอด Translate()
  9. ในการปรับขนาด (scale) Canvas 4 ให้เรียกเมธอด Scale()
  10. ในการหมุน Canvas 5 รอบจุดหนึ่ง 45 องศา เมธอด RotateAround() จะช่วยได้
  11. บันทึกเอกสาร 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");
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีตัด Canvas ของไฟล์ XPS ภายในโซลูชัน API ของ Aspose.Page สำหรับ C++

ในการตัด (clip) Canvas ของไฟล์ XPS ให้ทำตามคู่มือด้านล่าง:

  1. สร้างหรือเปิดไฟล์ XPS โดยใช้คลาส XpsDocument
  2. สร้าง Canvas หลักที่ใช้ร่วมกันสำหรับองค์ประกอบหน้าทั้งหมด โดยใช้เมธอด AddCanvas()
  3. สร้างออฟเซตซ้ายและบนใน Canvas หลักโดยใช้เมธอด CreateMatrix()
  4. สร้างรูปทรงเรขาคณิตเส้นทางสี่เหลี่ยมด้วยเมธอด CreatePathGeometry()
  5. สร้างการเติมสำหรับสี่เหลี่ยมโดยใช้คลาส XpsBrush
  6. ในการเพิ่ม Canvas อื่นพร้อม Clip ไปยัง Canvas หลัก ให้เรียกเมธอด AddCanvas() อีกครั้ง
  7. สร้างรูปทรงเรขาคณิตวงกลมสำหรับ Clip โดยใช้คลาส XpsPathGeometry
  8. ในการสร้างสี่เหลี่ยมใน Canvas นี้และเติม ให้ใช้คลาส XpsPath
  9. เพิ่ม Canvas อื่นด้วยเมธอด AddCanvas() จากนั้นสร้างสี่เหลี่ยมใน Canvas นี้และลากเส้น (stroke) ด้วยคลาส XpsPathGeometry
  10. บันทึกเอกสาร 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 รักษาเลย์เอาต์ข้ามแพลตฟอร์มและไม่ขึ้นกับระบบปฏิบัติการ