Работа с холстами (canvases) в XPS

Обрезка (clip) и преобразование (transform) холстов в XPS-файлах с помощью C++ API

 

В XPS-файлах холст (canvas) — это прямоугольная область на странице, где можно рисовать визуальное содержимое, такое как текст, изображения и фигуры. Он служит контейнером для этих элементов и обеспечивает структуру для их организации и наслоения (layering). Холсты можно повторно использовать в разных частях документа или даже в нескольких документах, что обеспечивает гибкий способ структурирования и организации содержимого в XPS-документе. Ключевые характеристики холстов в XPS-файлах:

  • Холсты могут быть вложены (nested) в другие холсты, создавая иерархическую структуру, которая допускает сложные макеты (layouts) и группировку элементов.
  • Холсты можно преобразовывать с помощью различных операций, таких как перемещение (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 Формат файла XPS

XPS (XML Paper Specification) — альтернативный Microsoft формат PDF, основанный на XML/HTML, сохраняет макет независимо от платформы.