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// For complete examples and data files, please go to https://github.com/aspose-page/Aspose.Page-for-Java
2// The path to the documents directory.
3String dataDir = Utils.getDataDir();
4// Create new XPS Document
5final XpsDocument doc = new XpsDocument();
6try {
7 // Set first page's size.
8 doc.getPage().setWidth(650f);
9 doc.getPage().setHeight(240f);
10
11 // Draw a circle with center (120, 120) and radius 100.
12 XpsPath path = doc.createPath(doc.getUtils().createCircle(new Point2D.Float(120f, 120f), 100f));
13 path.setFill(doc.createSolidColorBrush(Color.GREEN));
14 doc.add(path);
15
16 // Inscribe a regular pentagon in the circle.
17 path = doc.createPath(doc.getUtils().createRegularInscribedNGon(5, new Point2D.Float(120f, 120f), 100f));
18 path.setFill(doc.createSolidColorBrush(Color.RED));
19 doc.add(path);
20
21 // Circumscribe a regular hexagon around the circle.
22 path = doc.createPath(doc.getUtils().createRegularCircumscribedNGon(6, new Point2D.Float(120f, 120f), 100f));
23 path.setStroke(doc.createSolidColorBrush(Color.MAGENTA));
24 path.setStrokeThickness(3f);
25 doc.add(path);
26
27 // Draw a sector of the circle centered at (340, 120), starting at -45 degrees and ending at +45 degrees.
28 path = doc.createPath(doc.getUtils().createPieSlice(new Point2D.Float(340f, 120f), 100f, -45f, 45f));
29 path.setStroke(doc.createSolidColorBrush(Color.RED));
30 path.setStrokeThickness(5f);
31 doc.add(path);
32
33 // Draw a segment of the circle centered at (340, 120), starting at -45 degrees and ending at +45 degrees.
34 path = doc.createPath(doc.getUtils().createCircularSegment(new Point2D.Float(340f, 120f), 100f, -45f, 45f));
35 path.setFill(doc.createSolidColorBrush(Color.BLACK));
36 doc.add(path);
37
38 // Draw a rectangle with the top left vertex (530, 20), width 100 units and height 200 units.
39 path = doc.createPath(doc.getUtils().createRectangle(new Rectangle2D.Float(530f, 20f, 100f, 200f)));
40 path.setStroke(doc.createSolidColorBrush(Color.RED));
41 doc.add(path);
42
43 // Draw an ellipse with center (580, 120) and radii 50 and 100.
44 path = doc.createPath(doc.getUtils().createEllipse(new Point2D.Float(580f, 120f), 50f, 100f));
45 path.setFill(doc.createSolidColorBrush(Color.YELLOW));
46 doc.add(path);
47
48 doc.save(dataDir + "UseShapeUtilsXPS_out.xps");
49} finally {
50 if (doc != null)
51 doc.close();
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// For complete examples and data files, please go to https://github.com/aspose-page/Aspose.Page-for-Java
2// The path to the documents directory.
3String dataDir = Utils.getDataDir();
4// Create new XPS Document
5final XpsDocument doc = new XpsDocument();
6try {
7 // Set first page's size.
8 doc.getPage().setWidth(540f);
9 doc.getPage().setHeight(220f);
10
11 // Draw the image box.
12 Rectangle2D imageBox = new Rectangle2D.Float(10f, 10f, 200f, 200f);
13 XpsPath path = doc.addPath(doc.getUtils().createRectangle(imageBox));
14 path.setStroke(doc.createSolidColorBrush(Color.BLACK));
15 // Add an image to fit width.
16 path = doc.getUtils().createImage(dataDir + "R08LN_NN.jpg", imageBox, ImageMode.FitToWidth);
17 // Prevent tiling.
18 ((XpsImageBrush)path.getFill()).setTileMode(XpsTileMode.None);
19 doc.add(path);
20
21 // Add an image to fit width.
22 doc.add(doc.getUtils().createImage(
23 dataDir + "R08LN_NN.jpg", new Rectangle2D.Float(220f, 10f, 200f, 100f), ImageMode.FitToHeight));
24
25 // Add an image to fit width.
26 doc.add(doc.getUtils().createImage(
27 dataDir + "R08LN_NN.jpg", new Rectangle2D.Float(430f, 10f, 100f, 200f), ImageMode.FitToBox));
28
29 // Save resultant XPS document
30 doc.save(dataDir + "UseImageUtilsXPS_out.xps");
31} finally {
32 if (doc != null)
33 doc.close();
34}
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: