العمل مع اللوحات (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، اتبع الدليل أدناه:
- أنشئ ملف XPS باستخدام فئة XpsDocument.
- أنشئ اللوحة الرئيسية المشتركة لجميع عناصر الصفحة باستخدام الطريقة AddCanvas().
- قم بعمل إزاحات يسرى (left) وعلوية (top) في اللوحة الرئيسية باستخدام الطريقة CreateMatrix().
- أنشئ هندسة مسار مستطيل (rectangle path geometry) باستخدام الطريقة CreatePathGeometry().
- أنشئ تعبئة (fill) للمستطيلات باستخدام فئة XpsBrush.
- لإنشاء مستطيل في اللوحة 2 وملئه، استخدم فئة XpsPath.
- لنقل اللوحة 3 لوضع مستطيل جديد أسفل المستطيل السابق، استخدم الطريقة CreateMatrix().
- لنقل هذه اللوحة إلى الجانب الأيمن من الصفحة، استخدم الطريقة Translate().
- لتحجيم (scale) اللوحة 4، استدعِ الطريقة Scale().
- لتدوير اللوحة 5 حول نقطة بمقدار 45 درجة؛ الطريقة RotateAround() مفيدة هنا.
- احفظ مستند 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");لقص (clip) لوحات ملف XPS، اتبع الدليل أدناه:
- أنشئ أو افتح ملف XPS باستخدام فئة XpsDocument.
- أنشئ اللوحة الرئيسية المشتركة لجميع عناصر الصفحة باستخدام الطريقة AddCanvas().
- قم بعمل إزاحات يسرى وعلوية في اللوحة الرئيسية باستخدام الطريقة CreateMatrix().
- أنشئ هندسة مسار مستطيل باستخدام الطريقة CreatePathGeometry().
- أنشئ تعبئة للمستطيلات باستخدام فئة XpsBrush.
- لإضافة لوحة أخرى مع قص (clip) إلى اللوحة الرئيسية، استدعِ الطريقة AddCanvas() مرة أخرى.
- أنشئ هندسة دائرية (circle geometry) للقص باستخدام فئة XpsPathGeometry.
- لإنشاء مستطيل في هذه اللوحة وملئه، استخدم فئة XpsPath.
- أضف لوحة أخرى بالطريقة AddCanvas()، ثم أنشئ مستطيلًا في هذه اللوحة وارسم محيطه (stroke) باستخدام فئة XpsPathGeometry.
- احفظ مستند 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، ويُحافظ على مظهر المستند عبر مختلف الأنظمة.