Робота з полотнами (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, дотримуйтесь наведеного нижче посібника:

  1. Створіть файл XPS за допомогою класу XpsDocument.
  2. Створіть основне полотно, спільне для всіх елементів сторінки, за допомогою методу AddCanvas().
  3. Зробіть зміщення вліво та вгору в основному полотні за допомогою методу CreateMatrix().
  4. Створіть геометрію прямокутного шляху (rectangle path geometry) за допомогою методу CreatePathGeometry().
  5. Створіть заливку для прямокутників за допомогою класу XpsBrush.
  6. Для створення прямокутника на полотні 2 та його заповнення використовуйте клас XpsPath.
  7. Для переміщення (translate) полотна 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 у рамках рішення API Aspose.Page для C++.

Щоб обрізати (clip) полотна файлу XPS, дотримуйтесь наведеного нижче посібника:

  1. Створіть або відкрийте файл XPS за допомогою класу XpsDocument.
  2. Створіть основне полотно, спільне для всіх елементів сторінки, за допомогою методу AddCanvas().
  3. Зробіть зміщення вліво та вгору в основному полотні за допомогою методу CreateMatrix().
  4. Створіть геометрію прямокутного шляху за допомогою методу CreatePathGeometry().
  5. Створіть заливку для прямокутників за допомогою класу XpsBrush.
  6. Для додавання іншого полотна з обрізкою (clip) до основного полотна ще раз викличте метод AddCanvas().
  7. Створіть геометрію кола для обрізки за допомогою класу XpsPathGeometry.
  8. Для створення прямокутника на цьому полотні та його заповнення використовуйте клас XpsPath.
  9. Додайте інше полотно за допомогою методу AddCanvas(), потім створіть прямокутник на цьому полотні та обведіть його за допомогою класу 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 What is XPS File Format

XPS (XML Paper Specification) — альтернатива Microsoft до PDF. Заснований на XML/HTML, зберігає макет на різних платформах і не залежить від операційної системи.