العمل مع اللوحات (canvases) داخل XPS

قص (clip) وتحويل (transform) اللوحات في ملفات XPS باستخدام C++ API

 

في ملفات XPS، اللوحة (canvas) هي منطقة مستطيلة على الصفحة يمكن رسم المحتوى المرئي فيها، مثل النصوص والصور والأشكال. وهي تعمل كحاوية لهذه العناصر وتوفر إطارًا لتنظيمها وترتيبها في طبقات. يمكن إعادة استخدام اللوحات في أجزاء مختلفة من المستند أو حتى في مستندات متعددة، مما يوفر طريقة مرنة لتنظيم المحتوى داخل مستند XPS. الخصائص الرئيسية للوحات في ملفات XPS:

  • يمكن تداخل اللوحات (canvases) داخل لوحات أخرى، مما يخلق بنية هرمية تتيح تخطيطات (layouts) معقدة وتجميع العناصر.
  • يمكن تحويل اللوحات باستخدام عمليات مختلفة، مثل الإزاحة (translation) والتدوير (rotation) والتحجيم (scaling). يتيح ذلك تحديد المواضع وتغيير أحجام المحتوى بمرونة.
  • يمكن قص (clip) اللوحات إلى مناطق محددة، مما يحد من المساحة المرئية لمحتوياتها. وهذا مفيد لإنشاء أشكال وتأثيرات معقدة.
  • يمكن أن تحتوي اللوحات على عناصر مرئية مختلفة، بما في ذلك تشغيل النصوص (text runs) والفقرات (paragraphs) ومربعات النص (text boxes). كما يمكن أن تحتوي على صور وأشكال هندسية ولوحات أخرى.

إدارة اللوحات في المستندات هي إحدى الميزات التي يوفرها Aspose.Page لـ C++. يعمل هذا الحل مع لغات وصف الصفحات المختلفة، وخاصة XPS.

لتحويل (transform) لوحات ملف XPS، اتبع الدليل أدناه:

  1. أنشئ ملف XPS باستخدام فئة XpsDocument.
  2. أنشئ اللوحة الرئيسية المشتركة لجميع عناصر الصفحة باستخدام الطريقة AddCanvas().
  3. قم بعمل إزاحات يسرى (left) وعلوية (top) في اللوحة الرئيسية باستخدام الطريقة CreateMatrix().
  4. أنشئ هندسة مسار مستطيل (rectangle path geometry) باستخدام الطريقة CreatePathGeometry().
  5. أنشئ تعبئة (fill) للمستطيلات باستخدام فئة XpsBrush.
  6. لإنشاء مستطيل في اللوحة 2 وملئه، استخدم فئة XpsPath.
  7. لنقل اللوحة 3 لوضع مستطيل جديد أسفل المستطيل السابق، استخدم الطريقة CreateMatrix().
  8. لنقل هذه اللوحة إلى الجانب الأيمن من الصفحة، استخدم الطريقة Translate().
  9. لتحجيم (scale) اللوحة 4، استدعِ الطريقة Scale().
  10. لتدوير اللوحة 5 حول نقطة بمقدار 45 درجة؛ الطريقة RotateAround() مفيدة هنا.
  11. احفظ مستند XPS المعدَّل باستخدام الطريقة XpsDocument.Save().
تحويل اللوحة (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");
يوضح مقتطف الكود التالي كيفية قص لوحات ملفات XPS ضمن حل Aspose.Page for C++ API.

لقص (clip) لوحات ملف XPS، اتبع الدليل أدناه:

  1. أنشئ أو افتح ملف XPS باستخدام فئة XpsDocument.
  2. أنشئ اللوحة الرئيسية المشتركة لجميع عناصر الصفحة باستخدام الطريقة AddCanvas().
  3. قم بعمل إزاحات يسرى وعلوية في اللوحة الرئيسية باستخدام الطريقة CreateMatrix().
  4. أنشئ هندسة مسار مستطيل باستخدام الطريقة CreatePathGeometry().
  5. أنشئ تعبئة للمستطيلات باستخدام فئة XpsBrush.
  6. لإضافة لوحة أخرى مع قص (clip) إلى اللوحة الرئيسية، استدعِ الطريقة AddCanvas() مرة أخرى.
  7. أنشئ هندسة دائرية (circle geometry) للقص باستخدام فئة XpsPathGeometry.
  8. لإنشاء مستطيل في هذه اللوحة وملئه، استخدم فئة XpsPath.
  9. أضف لوحة أخرى بالطريقة AddCanvas()، ثم أنشئ مستطيلًا في هذه اللوحة وارسم محيطه (stroke) باستخدام فئة XpsPathGeometry.
  10. احفظ مستند XPS المعدَّل باستخدام الطريقة XpsDocument.Save().
قص اللوحة (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) يشبه PDF من حيث كونه تنسيقاً مستقلاً عن النظام. يُنشأ باستخدام HTML وXML، ويُحافظ على مظهر المستند عبر مختلف الأنظمة.