Trabajar con lienzos (canvases) en XPS
Recortar (clip) y transformar (transform) lienzos en archivos XPS usando la API de C++
En los archivos XPS, un lienzo (canvas) es un área rectangular en una página donde se puede dibujar contenido visual, como texto, imágenes y formas. Sirve como contenedor de estos elementos y proporciona un marco para organizarlos y superponerlos. Los lienzos se pueden reutilizar en diferentes partes del documento o incluso en varios documentos, lo que brinda una forma flexible de estructurar y organizar el contenido dentro de un documento XPS. Características clave de los lienzos en archivos XPS:
- Los lienzos pueden anidarse dentro de otros lienzos, creando una estructura jerárquica que permite diseños (layouts) complejos y la agrupación de elementos.
- Los lienzos se pueden transformar utilizando diversas operaciones, como traslación (translation), rotación (rotation) y escala (scaling). Esto permite un posicionamiento flexible y el cambio de tamaño del contenido.
- Los lienzos se pueden recortar (clip) a regiones específicas, limitando el área visible de su contenido. Esto es útil para crear formas y efectos intrincados.
- Los lienzos pueden contener diferentes elementos visuales, incluidas ejecuciones de texto (text runs), párrafos y cuadros de texto (text boxes). También pueden contener imágenes, formas geométricas y otros lienzos.
La gestión de lienzos en documentos es una de las características que ofrece Aspose.Page para C++. Esta solución funciona con diferentes lenguajes de descripción de páginas, XPS en particular.
Para transformar (transform) los lienzos de un archivo XPS, siga la guía a continuación:
- Cree un archivo XPS utilizando la clase XpsDocument.
- Cree el lienzo principal, común a todos los elementos de la página, utilizando el método AddCanvas().
- Realice desplazamientos izquierdo y superior en el lienzo principal usando el método CreateMatrix().
- Cree una geometría de ruta rectangular (rectangle path geometry) con el método CreatePathGeometry().
- Cree un relleno para los rectángulos usando la clase XpsBrush.
- Para crear un rectángulo en el lienzo 2 y rellenarlo, use la clase XpsPath.
- Para trasladar el lienzo 3 a fin de posicionar un nuevo rectángulo debajo del rectángulo anterior, use el método CreateMatrix().
- Para trasladar este lienzo al lado derecho de la página, use el método Translate().
- Para escalar el lienzo 4, llame al método Scale().
- Para rotar el lienzo 5 alrededor de un punto 45 grados; el método RotateAround() es muy útil.
- Guarde el documento XPS modificado utilizando el método XpsDocument.Save().
La transformación del lienzo (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");Para recortar (clip) los lienzos de un archivo XPS, siga la guía a continuación:
- Cree o abra un archivo XPS usando la clase XpsDocument.
- Cree el lienzo principal, común a todos los elementos de la página, utilizando el método AddCanvas().
- Realice desplazamientos izquierdo y superior en el lienzo principal usando el método CreateMatrix().
- Cree una geometría de ruta rectangular con el método CreatePathGeometry().
- Cree un relleno para los rectángulos usando la clase XpsBrush.
- Para agregar otro lienzo con un recorte (clip) al lienzo principal, llame al método AddCanvas() nuevamente.
- Cree una geometría circular para el recorte usando la clase XpsPathGeometry.
- Para crear un rectángulo en este lienzo y rellenarlo, use la clase XpsPath.
- Agregue otro lienzo con el método AddCanvas(), luego cree un rectángulo en este lienzo y trácelo con la clase XpsPathGeometry.
- Guarde el documento XPS modificado utilizando el método XpsDocument.Save().
El recorte del lienzo (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 Qué es XPS Formato de archivo
XPS (XML Paper Specification) es el equivalente de Microsoft a PDF. Se basa en XML/HTML, mantiene el diseño en distintas plataformas y es independiente del sistema operativo.