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:

  1. Crea un file XPS utilizzando la classe XpsDocument.
  2. Crea il canvas principale, comune a tutti gli elementi della pagina, utilizzando il metodo AddCanvas().
  3. Effettua offset sinistro e superiore nel canvas principale utilizzando il metodo CreateMatrix().
  4. Crea una geometria del percorso rettangolare (rectangle path geometry) con il metodo CreatePathGeometry().
  5. Crea un riempimento per i rettangoli utilizzando la classe XpsBrush.
  6. Per creare un rettangolo nel canvas 2 e riempirlo, utilizza la classe XpsPath.
  7. Per traslare il canvas 3 in modo da posizionare un nuovo rettangolo sotto il rettangolo precedente, utilizza il metodo CreateMatrix().
  8. Per traslare questo canvas sul lato destro della pagina, usa il metodo Translate().
  9. Per ridimensionare (scale) il canvas 4, chiama il metodo Scale().
  10. Per ruotare (rotate) il canvas 5 attorno a un punto di 45 gradi; il metodo RotateAround() è molto utile.
  11. 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");
Il seguente frammento di codice mostra come ritagliare i canvas dei file XPS all'interno della soluzione API Aspose.Page per C++.

Per ritagliare (clip) i canvas di un file XPS, segui la guida di seguito:

  1. Crea o apri un file XPS usando la classe XpsDocument.
  2. Crea il canvas principale, comune a tutti gli elementi della pagina, utilizzando il metodo AddCanvas().
  3. Effettua offset sinistro e superiore nel canvas principale utilizzando il metodo CreateMatrix().
  4. Crea una geometria del percorso rettangolare con il metodo CreatePathGeometry().
  5. Crea un riempimento per i rettangoli utilizzando la classe XpsBrush.
  6. Per aggiungere un altro canvas con un clip al canvas principale, chiama nuovamente il metodo AddCanvas().
  7. Crea la geometria circolare per il clip usando la classe XpsPathGeometry.
  8. Per creare un rettangolo in questo canvas e riempirlo, usa la classe XpsPath.
  9. Aggiungi un altro canvas con il metodo AddCanvas(), quindi crea un rettangolo in questo canvas e traccialo con la classe XpsPathGeometry.
  10. 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.