Lavorare con i canvas all’interno di XPS
Ritagliare (clip) e trasformare (transform) i canvas nei file XPS utilizzando l’API C++
Nei file XPS, un canvas è un'area rettangolare su una pagina in cui è possibile disegnare contenuti visivi, come testo, immagini e forme. Funge da contenitore per questi elementi e fornisce un framework per organizzarli e stratificarli (layering). I canvas possono essere riutilizzati in diverse parti del documento o anche in più documenti, il che fornisce un modo flessibile per strutturare e organizzare i contenuti all'interno di un documento XPS. Caratteristiche chiave dei canvas nei file XPS:
- I canvas possono essere annidati (nested) all’interno di altri canvas, creando una struttura gerarchica che consente layout (layouts) complessi e il raggruppamento di elementi.
- I canvas possono essere trasformati utilizzando varie operazioni, come traslazione (translation), rotazione (rotation) e ridimensionamento (scaling). Ciò consente un posizionamento flessibile e il ridimensionamento del contenuto.
- I canvas possono essere ritagliati (clip) in regioni specifiche, limitando l’area visibile del loro contenuto. Ciò è utile per creare forme ed effetti intricati.
- I canvas possono contenere diversi elementi visivi, inclusi esecuzioni di testo (text runs), paragrafi e caselle di testo (text boxes). Possono anche contenere immagini, forme geometriche e altri canvas.
La gestione dei canvas nei documenti è una delle funzionalità offerte da Aspose.Page per C++. Questa soluzione funziona con diversi linguaggi di descrizione della pagina, XPS in particolare.
Per trasformare (transform) i canvas di un file XPS, segui la guida di seguito:
- Crea un file XPS utilizzando la classe XpsDocument.
- Crea il canvas principale, comune a tutti gli elementi della pagina, utilizzando il metodo AddCanvas().
- Effettua offset sinistro e superiore nel canvas principale utilizzando il metodo CreateMatrix().
- Crea una geometria del percorso rettangolare (rectangle path geometry) con il metodo CreatePathGeometry().
- Crea un riempimento per i rettangoli utilizzando la classe XpsBrush.
- Per creare un rettangolo nel canvas 2 e riempirlo, utilizza la classe XpsPath.
- Per traslare il canvas 3 in modo da posizionare un nuovo rettangolo sotto il rettangolo precedente, utilizza il metodo CreateMatrix().
- Per traslare questo canvas sul lato destro della pagina, usa il metodo Translate().
- Per ridimensionare (scale) il canvas 4, chiama il metodo Scale().
- Per ruotare (rotate) il canvas 5 attorno a un punto di 45 gradi; il metodo RotateAround() è molto utile.
- Salva il documento XPS modificato utilizzando il metodo XpsDocument.Save().
La trasformazione del canvas (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");Per ritagliare (clip) i canvas di un file XPS, segui la guida di seguito:
- Crea o apri un file XPS usando la classe XpsDocument.
- Crea il canvas principale, comune a tutti gli elementi della pagina, utilizzando il metodo AddCanvas().
- Effettua offset sinistro e superiore nel canvas principale utilizzando il metodo CreateMatrix().
- Crea una geometria del percorso rettangolare con il metodo CreatePathGeometry().
- Crea un riempimento per i rettangoli utilizzando la classe XpsBrush.
- Per aggiungere un altro canvas con un clip al canvas principale, chiama nuovamente il metodo AddCanvas().
- Crea la geometria circolare per il clip usando la classe XpsPathGeometry.
- Per creare un rettangolo in questo canvas e riempirlo, usa la classe XpsPath.
- Aggiungi un altro canvas con il metodo AddCanvas(), quindi crea un rettangolo in questo canvas e traccialo con la classe XpsPathGeometry.
- Salva il documento XPS modificato utilizzando il metodo XpsDocument.Save().
Il ritaglio del canvas (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 Cos'è il formato file XPS
XPS (XML Paper Specification) è l’alternativa Microsoft al PDF. Basato su XML/HTML, mantiene il layout su diverse piattaforme ed è indipendente dal sistema operativo.