Utilização de utilitários gráficos XPS | Java
Como produzir facilmente formas básicas em XPS
A especificação XPS define elementos gráficos primitivos que podem ser utilizados para compor qualquer forma complexa. O Aspose.Page para Java disponibiliza classes que encapsulam estes elementos. No entanto, criar formas mesmo relativamente simples, como um setor ou segmento circular, ou um n-gono regular inscrito ou circunscrito num círculo, pode ser um pouco tedioso. Mesmo desenhar um círculo ou uma elipse não é tão simples como poderia ser. É por isso que o Aspose.Page também oferece um conjunto de métodos utilitários para ajudar a poupar tempo ao trabalhar nestas tarefas.
No exemplo abaixo, utilizámos todos os utilitários de forma disponíveis. É importante notar que cada um destes métodos utilitários devolve um objeto de XpsPathGeometry, que pode ser utilizado para criar caminhos XPS. E para estes caminhos, pode especificar propriedades de aparência — pincéis, padrão de traçado, opacidade, 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}Começamos por criar um novo documento XPS e ajustar o tamanho da primeira página. A primeira forma que adicionamos à página é um círculo verde sólido especificado pelo seu centro e raio. Em seguida, desenhamos um pentágono regular vermelho sem preenchimento inscrito nesse círculo. Segue-se um hexágono regular com contorno magenta e circunscrito à volta do círculo.
À direita, desenhamos um sector circular vermelho (ou uma “fatia de pizza”) entre -45 e +45 graus, seguido de um segmento circular preto com os mesmos parâmetros sobre o sector.
A última parte do desenho inclui um retângulo vermelho (especificado pelo seu canto superior esquerdo e dimensões) e uma elipse amarela (especificada pelo seu centro e raios) inscrita no retângulo. Neste caso, manipulámos a inscrição “manualmente”.
Eis a saída pretendida no ficheiro XPS guardado:

Como facilmente inserir uma imagem numa página XPS
Quando se utilizam primitivas definidas pela especificação XPS, a inserção de uma imagem numa página implica dois passos:
- Adicionar um caminho retangular (caixa de imagem) para preencher com a imagem;
- Aplicar um pincel de imagem à caixa de imagem, onde é necessário especificar uma caixa de visualização e uma janela de visualização. Normalmente, terá de saber a resolução e o tamanho em pixéis da sua imagem para fornecer estes parâmetros com precisão.
Mas, felizmente, existe um método conveniente entre os utilitários gráficos XPS na API Aspose.Page para Java que pode tratar da maior parte do trabalho por si. Também oferece modos de ajuste comuns. Vejamos o seguinte exemplo:
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}Mais uma vez, começamos com um novo documento XPS e redimensionamos a primeira página. De referir que, por defeito, a imagem utilizada como pincel será disposta em mosaico na caixa de imagem da mesma forma que se estivesse no modo XpsTileMode.Tile. No entanto, na primeira parte do exemplo, mostramos como evitar este mosaico.
Assim, primeiro queremos que a imagem seja apresentada nas coordenadas (10, 10) e se ajuste à largura da caixa retangular, que tem 200 unidades de largura e 200 unidades de altura. Para melhor visualizar o resultado, desenhamos primeiro a própria caixa. De seguida, procedemos à criação da imagem (que é essencialmente um caminho preenchido). Por fim, após obter o preenchimento do caminho e convertê-lo para
XpsImageBrush, definimos a propriedade TileMode como XpsTileMode.None.
À direita, posicionamos a mesma imagem ajustando-a à altura da caixa de imagem. Observe o efeito de mosaico.
Por fim, posicionamos a mesma imagem à direita mais uma vez e ajustamo-la de modo a que se ajuste à altura e à largura da caixa de imagem, resultando em alguma distorção da imagem.
E aqui está o resultado no ficheiro XPS guardado:
