Travailler avec les canevas (canvases) dans XPS
Rogner (clip) et transformer (transform) les canevas dans les fichiers XPS à l’aide de l’API C++
Dans les fichiers XPS, un canevas (canvas) est une zone rectangulaire sur une page où du contenu visuel, comme du texte, des images et des formes, peut être dessiné. Il sert de conteneur pour ces éléments et fournit un cadre pour les organiser et les superposer. Les canevas peuvent être réutilisés dans différentes parties du document ou même dans plusieurs documents, ce qui offre une façon flexible de structurer et d'organiser le contenu dans un document XPS. Caractéristiques clés des canevas dans les fichiers XPS :
- Les canevas peuvent être imbriqués dans d’autres canevas, créant une structure hiérarchique qui permet des mises en page (layouts) complexes et le regroupement d’éléments.
- Les canevas peuvent être transformés à l’aide de diverses opérations, telles que la translation, la rotation et la mise à l’échelle (scaling). Cela permet un positionnement flexible et le redimensionnement du contenu.
- Les canevas peuvent être rognés (clip) sur des régions spécifiques, limitant la zone visible de leur contenu. Ceci est utile pour créer des formes et des effets complexes.
- Les canevas peuvent contenir différents éléments visuels, notamment des exécutions de texte (text runs), des paragraphes et des zones de texte (text boxes). Ils peuvent également contenir des images, des formes géométriques et d’autres canevas.
La gestion des canevas dans les documents est l'une des fonctionnalités proposées par Aspose.Page pour C++. Cette solution fonctionne avec différents langages de description de page, XPS en particulier.
Pour transformer (transform) les canevas d'un fichier XPS, suivez le guide ci-dessous :
- Créez un fichier XPS à l’aide de la classe XpsDocument.
- Créez le canevas principal, commun à tous les éléments de la page, à l’aide de la méthode AddCanvas().
- Effectuez des décalages gauche et supérieur dans le canevas principal à l’aide de la méthode CreateMatrix().
- Créez une géométrie de chemin rectangulaire (rectangle path geometry) avec la méthode CreatePathGeometry().
- Créez un remplissage pour les rectangles à l’aide de la classe XpsBrush.
- Pour créer un rectangle dans le canevas 2 et le remplir, utilisez la classe XpsPath.
- Pour translater le canevas 3 afin de positionner un nouveau rectangle sous le rectangle précédent, utilisez la méthode CreateMatrix().
- Pour translater ce canevas vers la droite de la page, utilisez la méthode Translate().
- Pour mettre à l’échelle (scale) le canevas 4, appelez la méthode Scale().
- Pour faire pivoter (rotate) le canevas 5 autour d’un point de 45 degrés ; la méthode RotateAround() est très utile.
- Enregistrez le document XPS modifié à l’aide de la méthode XpsDocument.Save().
La transformation du canevas (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");Pour rogner (clip) les canevas d'un fichier XPS, suivez le guide ci-dessous :
- Créez ou ouvrez un fichier XPS à l’aide de la classe XpsDocument.
- Créez le canevas principal, commun à tous les éléments de la page, à l’aide de la méthode AddCanvas().
- Effectuez des décalages gauche et supérieur dans le canevas principal à l’aide de la méthode CreateMatrix().
- Créez une géométrie de chemin rectangulaire avec la méthode CreatePathGeometry().
- Créez un remplissage pour les rectangles à l’aide de la classe XpsBrush.
- Pour ajouter un autre canevas avec un rognage (clip) au canevas principal, appelez à nouveau la méthode AddCanvas().
- Créez une géométrie de cercle pour le rognage à l’aide de la classe XpsPathGeometry.
- Pour créer un rectangle dans ce canevas et le remplir, utilisez la classe XpsPath.
- Ajoutez un autre canevas avec la méthode AddCanvas(), puis créez un rectangle dans ce canevas et tracez-le avec la classe XpsPathGeometry.
- Enregistrez le document XPS modifié à l’aide de la méthode XpsDocument.Save().
Le rognage du canevas (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'est-ce que le format de fichier XPS
XPS (XML Paper Specification) est l’équivalent Microsoft du PDF. Il repose sur XML/HTML, préserve la mise en page sur toutes les plateformes et est indépendant du système d’exploitation.