Usando utilidades gráficas XPS | Java
Cómo fácilmente producir formas básicas en XPS
La especificación XPS define elementos gráficos primitivos que se pueden utilizar para componer cualquier forma compleja. Aspose.Page para Java proporciona clases que encapsulan estos elementos. Sin embargo, crear incluso formas relativamente simples, como un sector o segmento circular, o un n-gon regular inscrito o circunscrito alrededor de un círculo, puede resultar un poco tedioso. Incluso dibujar un círculo o una elipse no es tan sencillo como podría ser. Es por eso que Aspose.Page también ofrece un conjunto de métodos de utilidad para ayudar a ahorrar tiempo al trabajar en estas tareas.
En el siguiente ejemplo, utilizamos todas las utilidades de formas disponibles. Es importante tener en cuenta que cada uno de estos métodos de utilidad devuelve un objeto de XpsPathGeometry, que luego puede usarse para crear rutas XPS. Y para estos trazados, puede especificar propiedades de apariencia: pinceles, patrón de trazo, opacidad, etc.
1// Using shape utilities for adding shapes to XPS document.
2
3String outputFileName = "UseShapeUtilsXPS_out.xps";
4
5// Create new XPS Document
6XpsDocument doc = new XpsDocument();
7try {
8 // Set first page's size.
9 doc.getPage().setWidth(650f);
10 doc.getPage().setHeight(240f);
11
12 // Draw a circle with center (120, 120) and radius 100.
13 XpsPath path = doc.createPath(doc.getUtils().createCircle(new java.awt.geom.Point2D.Float(120f, 120f), 100f));
14 path.setFill(doc.createSolidColorBrush(doc.createColor(0, 255, 0)));
15 doc.add(path);
16
17 // Inscribe a regular pentagon in the circle.
18 path = doc.createPath(doc.getUtils().createRegularInscribedNGon(5, new java.awt.geom.Point2D.Float(120f, 120f), 100f));
19 path.setFill(doc.createSolidColorBrush(doc.createColor(255, 0, 0)));
20 doc.add(path);
21
22 // Circumscribe a regular hexagon around the circle.
23 path = doc.createPath(doc.getUtils().createRegularCircumscribedNGon(6, new java.awt.geom.Point2D.Float(120f, 120f), 100f));
24 path.setStroke(doc.createSolidColorBrush(doc.createColor(255, 0, 255)));
25 path.setStrokeThickness(3f);
26 doc.add(path);
27
28 // Draw a sector of the circle centered at (340, 120), starting at -45 degrees and ending at +45 degrees.
29 path = doc.createPath(doc.getUtils().createPieSlice(new java.awt.geom.Point2D.Float(340f, 120f), 100f, -45f, 45f));
30 path.setStroke(doc.createSolidColorBrush(doc.createColor(255, 0, 0)));
31 path.setStrokeThickness(5f);
32 doc.add(path);
33
34 // Draw a segment of the circle centered at (340, 120), starting at -45 degrees and ending at +45 degrees.
35 path = doc.createPath(doc.getUtils().createCircularSegment(new java.awt.geom.Point2D.Float(340f, 120f), 100f, -45f, 45f));
36 path.setFill(doc.createSolidColorBrush(doc.createColor(0, 0, 0)));
37 doc.add(path);
38
39 // Draw a rectangle with the top left vertex (530, 20), width 100 units and height 200 units.
40 path = doc.createPath(doc.getUtils().createRectangle(new Rectangle2D.Float(530f, 20f, 100f, 200f)));
41 path.setStroke(doc.createSolidColorBrush(doc.createColor(255, 0, 0)));
42 doc.add(path);
43
44 // Draw an ellipse with center (580, 120) and radii 50 and 100.
45 path = doc.createPath(doc.getUtils().createEllipse(new java.awt.geom.Point2D.Float(580f, 120f), 50f, 100f));
46 path.setFill(doc.createSolidColorBrush(doc.createColor(255, 255, 0)));
47 doc.add(path);
48
49 doc.save(getOutputDir() + outputFileName);
50} finally {
51 // nothing to dispose explicitly
52}Comenzamos creando un nuevo documento XPS y luego ajustando el tamaño de la primera página. La primera forma que agregamos a la página es un círculo verde sólido especificado por su centro y radio. A continuación, dibujamos un pentágono regular rojo vacío inscrito en ese círculo. Luego viene un hexágono regular rayado de magenta y circunscrito alrededor del círculo.
A la derecha, dibujamos un sector circular rojo (o una “porción circular”) entre -45 y +45 grados, seguido de un segmento circular negro con los mismos parámetros en la parte superior del sector.
La última parte del dibujo incluye un rectángulo rojo (especificado por su esquina superior izquierda y sus dimensiones) y una elipse amarilla (especificada por su centro y radios) inscrita en el rectángulo. En este caso manejamos la inscripción “a mano”.
Este es el resultado previsto en el archivo XPS guardado:

Cómo fácil colocar una imagen en una página XPS
Cuando se utilizan primitivas definidas por la especificación XPS, colocar una imagen en una página implica dos pasos:
- Agregar un trazado rectangular (cuadro de imagen) para rellenar con la imagen;
- Aplicar un pincel de imagen al cuadro de imagen, donde debe especificar un cuadro de vista y una ventana gráfica. Normalmente, necesitará conocer la resolución y el tamaño en píxeles de su imagen para proporcionar estos parámetros con precisión.
Pero, afortunadamente, existe un método conveniente entre las utilidades gráficas XPS en la API Aspose.Page para Java que puede realizar la mayor parte del trabajo por usted. También le ofrece modos de ajuste comunes. Veamos el siguiente ejemplo:
1// Using image utilities for adding images to XPS document.
2
3String outputFileName = "UseImageUtilsXPS_out.xps";
4
5// Create new XPS Document
6XpsDocument doc = new XpsDocument();
7try {
8 // Set first page's size.
9 doc.getPage().setWidth(540f);
10 doc.getPage().setHeight(220f);
11
12 // Draw the image box.
13 java.awt.geom.Rectangle2D.Float imageBox = new java.awt.geom.Rectangle2D.Float(10f, 10f, 200f, 200f);
14 XpsPath path = doc.addPath(doc.getUtils().createRectangle(imageBox));
15 path.setStroke(doc.createSolidColorBrush(doc.createColor(0, 0, 0)));
16 // Add an image to fit width.
17 path = doc.getUtils().createImage(getDataDir() + "R08LN_NN.jpg", imageBox, com.aspose.xps.ImageMode.FitToWidth);
18 // Prevent tiling.
19 ((XpsImageBrush)path.getFill()).setTileMode(com.aspose.xps.XpsTileMode.None);
20 doc.add(path);
21
22 // Add other images using utils
23 doc.add(doc.getUtils().createImage(getDataDir() + "R08LN_NN.jpg", new Rectangle2D.Float(220f, 10f, 200f, 100f), com.aspose.xps.ImageMode.FitToHeight));
24 doc.add(doc.getUtils().createImage(getDataDir() + "R08LN_NN.jpg", new Rectangle2D.Float(430f, 10f, 100f, 200f), com.aspose.xps.ImageMode.FitToBox));
25
26 // Save resultant XPS document
27 doc.save(getOutputDir() + outputFileName);
28} finally {
29 // nothing to dispose explicitly here
30}Nuevamente, comenzamos con un nuevo documento XPS y cambiamos el tamaño de la primera página. Vale la pena mencionar aquí que, de forma predeterminada, la imagen que se usa como pincel se colocará en mosaico en el cuadro de la imagen de la misma manera que si se usara en el modo XpsTileMode.Tile. Sin embargo, en la primera parte del ejemplo, mostramos cómo evitar este mosaico.
Entonces, primero queremos que la imagen se muestre en las coordenadas (10, 10) y que se ajuste al ancho del cuadro rectangular, que tiene 200 unidades de ancho y 200 unidades de alto. Para visualizar mejor el resultado, primero dibujamos el cuadro. Luego, procedemos a crear la imagen (que es esencialmente un camino relleno). Finalmente, después de obtener el relleno de la ruta y convertirlo en
XpsImageBrush, configuramos la propiedad TileMode en XpsTileMode.None.
A la derecha colocamos la misma imagen ajustándose a la altura del cuadro de imagen. Observe el efecto mosaico.
Finalmente, colocamos la misma imagen a la derecha una vez más y la ajustamos para que se ajuste tanto a la altura como al ancho del cuadro de imagen, lo que produce cierta distorsión de la imagen.
Y aquí está el resultado en el archivo XPS guardado:
