Робота з полотнами (canvases) у XPS
Обрізка (clip) та перетворення (transform) полотен у файлах XPS за допомогою C++ API
У файлах XPS полотно (canvas) — це прямокутна область на сторінці, де можна малювати візуальний вміст, наприклад текст, зображення та фігури. Воно слугує контейнером для цих елементів і забезпечує структуру для їхньої організації та нашарування (layering). Полотна можна повторно використовувати в різних частинах документа або навіть у кількох документах, що забезпечує гнучкий спосіб структурування та організації вмісту в документі XPS. Ключові характеристики полотен у файлах XPS:
- Полотна можуть бути вкладені (nested) в інші полотна, утворюючи ієрархічну структуру, яка дозволяє створювати складні макети (layouts) та групувати елементи.
- Полотна можна перетворювати (transform) за допомогою різних операцій, таких як переміщення (translation), обертання (rotation) та масштабування (scaling). Це забезпечує гнучке позиціонування та зміну розміру вмісту.
- Полотна можна обрізати (clip) до певних областей, обмежуючи видиму область їхнього вмісту. Це корисно для створення складних фігур та ефектів.
- Полотна можуть містити різні візуальні елементи, включаючи текстові блоки (text runs), абзаци (paragraphs) та текстові поля (text boxes). Вони також можуть містити зображення, геометричні фігури та інші полотна.
Керування полотнами в документах — одна з функцій, що пропонується Aspose.Page для C++. Це рішення працює з різними мовами опису сторінок, зокрема XPS.
Щоб перетворити (transform) полотна файлу XPS, дотримуйтесь наведеного нижче посібника:
- Створіть файл XPS за допомогою класу XpsDocument.
- Створіть основне полотно, спільне для всіх елементів сторінки, за допомогою методу AddCanvas().
- Зробіть зміщення вліво та вгору в основному полотні за допомогою методу CreateMatrix().
- Створіть геометрію прямокутного шляху (rectangle path geometry) за допомогою методу CreatePathGeometry().
- Створіть заливку для прямокутників за допомогою класу XpsBrush.
- Для створення прямокутника на полотні 2 та його заповнення використовуйте клас XpsPath.
- Для переміщення (translate) полотна 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().
- Створіть геометрію кола для обрізки за допомогою класу XpsPathGeometry.
- Для створення прямокутника на цьому полотні та його заповнення використовуйте клас XpsPath.
- Додайте інше полотно за допомогою методу AddCanvas(), потім створіть прямокутник на цьому полотні та обведіть його за допомогою класу 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 What is XPS File Format
XPS (XML Paper Specification) — альтернатива Microsoft до PDF. Заснований на XML/HTML, зберігає макет на різних платформах і не залежить від операційної системи.