Mit Canvases in XPS arbeiten
Canvases in XPS-Dateien mit der C++ API beschneiden (clip) und transformieren (transform)
In XPS-Dateien ist eine Canvas ein rechteckiger Bereich auf einer Seite, in dem visuelle Inhalte wie Text, Bilder und Formen gezeichnet werden können. Sie dient als Container für diese Elemente und bietet einen Rahmen zur Organisation und Schichtung (layering). Canvases können in verschiedenen Teilen des Dokuments oder sogar in mehreren Dokumenten wiederverwendet werden, was eine flexible Möglichkeit zur Strukturierung und Organisation von Inhalten in einem XPS-Dokument bietet. Hauptmerkmale von Canvases in XPS-Dateien:
- Canvases können innerhalb anderer Canvases verschachtelt werden, wodurch eine hierarchische Struktur entsteht, die komplexe Layouts und das Gruppieren von Elementen ermöglicht.
- Canvases können mithilfe verschiedener Operationen transformiert werden, z. B. Verschiebung (translation), Drehung (rotation) und Skalierung (scaling). Dies ermöglicht eine flexible Positionierung und Größenänderung von Inhalten.
- Canvases können auf bestimmte Bereiche beschnitten (clip) werden, wodurch der sichtbare Bereich ihres Inhalts begrenzt wird. Dies ist nützlich zum Erstellen komplizierter Formen und Effekte.
- Canvases können verschiedene visuelle Elemente enthalten, darunter Textabfolgen (text runs), Absätze (paragraphs) und Textfelder (text boxes). Sie können auch Bilder, geometrische Formen und andere Canvases enthalten.
Die Verwaltung von Canvases in Dokumenten ist eine der Funktionen, die Aspose.Page für C++ bietet. Diese Lösung funktioniert mit verschiedenen Seitenbeschreibungssprachen, insbesondere XPS.
Um Canvases einer XPS-Datei zu transformieren (transform), folgen Sie der nachstehenden Anleitung:
- Erstellen Sie eine XPS-Datei mithilfe der Klasse XpsDocument.
- Erstellen Sie die gemeinsame Haupt-Canvas für alle Seitenelemente mithilfe der Methode AddCanvas().
- Nehmen Sie mithilfe der Methode CreateMatrix() linke und obere Versätze in der Haupt-Canvas vor.
- Erstellen Sie mit der Methode CreatePathGeometry() eine Rechteckspfadgeometrie (rectangle path geometry).
- Erstellen Sie eine Füllung für Rechtecke mithilfe der Klasse XpsBrush.
- Um ein Rechteck in Canvas 2 zu erstellen und zu füllen, verwenden Sie die Klasse XpsPath.
- Um Canvas 3 so zu verschieben, dass ein neues Rechteck unterhalb des vorherigen Rechtecks positioniert wird, verwenden Sie die Methode CreateMatrix().
- Um diese Canvas auf die rechte Seite der Seite zu verschieben, verwenden Sie die Methode Translate().
- Um Canvas 4 zu skalieren, rufen Sie die Methode Scale() auf.
- Um Canvas 5 um 45 Grad um einen Punkt zu drehen, ist die Methode RotateAround() hilfreich.
- Speichern Sie das geänderte XPS-Dokument mithilfe der Methode XpsDocument.Save().
Die 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");Um Canvases einer XPS-Datei zu beschneiden (clip), folgen Sie der nachstehenden Anleitung:
- Erstellen oder öffnen Sie eine XPS-Datei mithilfe der Klasse XpsDocument.
- Erstellen Sie die gemeinsame Haupt-Canvas für alle Seitenelemente mithilfe der Methode AddCanvas().
- Nehmen Sie mithilfe der Methode CreateMatrix() linke und obere Versätze in der Haupt-Canvas vor.
- Erstellen Sie mit der Methode CreatePathGeometry() eine Rechteckspfadgeometrie.
- Erstellen Sie eine Füllung für Rechtecke mithilfe der Klasse XpsBrush.
- Um eine weitere Canvas mit einem Schnitt (clip) zur Haupt-Canvas hinzuzufügen, rufen Sie die Methode AddCanvas() erneut auf.
- Erstellen Sie Kreisgeometrie für den Schnitt mithilfe der Klasse XpsPathGeometry.
- Um ein Rechteck in dieser Canvas zu erstellen und zu füllen, verwenden Sie die Klasse XpsPath.
- Fügen Sie mit der Methode AddCanvas() eine weitere Canvas hinzu, erstellen Sie dann ein Rechteck in dieser Canvas und konturieren Sie es mit der Klasse XpsPathGeometry.
- Speichern Sie das geänderte XPS-Dokument mithilfe der Methode XpsDocument.Save().
Das 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 Was ist XPS Dateiformat
XPS (XML Paper Specification) ist Microsofts PDF‑Äquivalent. Es basiert auf XML/HTML, bewahrt das Layout über verschiedene Plattformen hinweg und ist unabhängig vom Betriebssystem.