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 :

  1. Créez un fichier XPS à l’aide de la classe XpsDocument.
  2. Créez le canevas principal, commun à tous les éléments de la page, à l’aide de la méthode AddCanvas().
  3. Effectuez des décalages gauche et supérieur dans le canevas principal à l’aide de la méthode CreateMatrix().
  4. Créez une géométrie de chemin rectangulaire (rectangle path geometry) avec la méthode CreatePathGeometry().
  5. Créez un remplissage pour les rectangles à l’aide de la classe XpsBrush.
  6. Pour créer un rectangle dans le canevas 2 et le remplir, utilisez la classe XpsPath.
  7. Pour translater le canevas 3 afin de positionner un nouveau rectangle sous le rectangle précédent, utilisez la méthode CreateMatrix().
  8. Pour translater ce canevas vers la droite de la page, utilisez la méthode Translate().
  9. Pour mettre à l’échelle (scale) le canevas 4, appelez la méthode Scale().
  10. Pour faire pivoter (rotate) le canevas 5 autour d’un point de 45 degrés ; la méthode RotateAround() est très utile.
  11. 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");
L'extrait de code suivant montre comment rogner des canevas de fichiers XPS dans la solution API Aspose.Page pour C++.

Pour rogner (clip) les canevas d'un fichier XPS, suivez le guide ci-dessous :

  1. Créez ou ouvrez un fichier XPS à l’aide de la classe XpsDocument.
  2. Créez le canevas principal, commun à tous les éléments de la page, à l’aide de la méthode AddCanvas().
  3. Effectuez des décalages gauche et supérieur dans le canevas principal à l’aide de la méthode CreateMatrix().
  4. Créez une géométrie de chemin rectangulaire avec la méthode CreatePathGeometry().
  5. Créez un remplissage pour les rectangles à l’aide de la classe XpsBrush.
  6. Pour ajouter un autre canevas avec un rognage (clip) au canevas principal, appelez à nouveau la méthode AddCanvas().
  7. Créez une géométrie de cercle pour le rognage à l’aide de la classe XpsPathGeometry.
  8. Pour créer un rectangle dans ce canevas et le remplir, utilisez la classe XpsPath.
  9. Ajoutez un autre canevas avec la méthode AddCanvas(), puis créez un rectangle dans ce canevas et tracez-le avec la classe XpsPathGeometry.
  10. 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.