Использование графических утилит XPS | Java
Как легко создавать базовые фигуры в XPS
Спецификация XPS определяет графические примитивные элементы, которые можно использовать для создания любых сложных фигур. Aspose.Page для Java предоставляет классы, инкапсулирующие эти элементы. Однако создание даже относительно простых фигур, таких как круговой сектор или сегмент или правильный n-угольник, вписанный в круг или описанный вокруг него, может быть немного утомительным. Даже нарисовать круг или эллипс не так просто, как могло бы быть. Вот почему Aspose.Page также предлагает набор служебных методов, помогающих сэкономить время при работе над этими задачами.
В примере ниже мы используем все доступные утилиты фигур. Важно отметить, что каждый из этих служебных методов возвращает объект XpsPathGeometry, который затем можно использовать для создания путей XPS. И для этих путей можно указать свойства внешнего вида — кисти, рисунок обводки, непрозрачность и т. д.
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}
Начнем с создания нового документа XPS, а затем настроим размер первой страницы. Первая фигура, которую мы добавляем на страницу, представляет собой сплошной зеленый круг, заданный его центром и радиусом. Далее мы рисуем незаполненный красный правильный пятиугольник, вписанный в этот круг. Затем идет правильный шестиугольник, обведенный пурпурным цветом и описанный вокруг круга.
Справа мы рисуем красный круговой сектор (или «кусочек пирога») между -45 и +45 градусами, за которым следует черный круглый сегмент с такими же параметрами поверх сектора.
Последняя часть рисунка включает красный прямоугольник (заданный его верхним левым углом и размерами) и желтый эллипс (заданный его центром и радиусами), вписанный в прямоугольник. В этом случае обрабатываем надпись «от руки».
Вот предполагаемый результат в сохраненном файле XPS:
Как легко разместить изображение на странице XPS
При использовании примитивов, определенных спецификацией XPS, размещение изображения на странице включает два шага:
- Добавление прямоугольного пути (окна изображения) для заполнения изображением;
- Применение кисти изображения к окну изображения, где необходимо указать окно просмотра и область просмотра. Обычно вам необходимо знать разрешение и размер вашего изображения в пикселях, чтобы точно указать эти параметры.
Но, к счастью, среди графических утилит XPS есть удобный метод — Aspose.Page API для Java, который может выполнить за вас большую часть работы. Он также предлагает вам общие режимы подгонки. Давайте посмотрим на следующий пример:
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}
И снова мы начинаем с нового документа XPS и изменяем размер первой страницы. Здесь стоит отметить, что по умолчанию ваше изображение, используемое в качестве кисти, будет располагаться по окну изображения так же, как если бы оно использовалось в режиме XpsTileMode.Tile. Однако в первой части примера мы покажем, как предотвратить такое разбиение.
Итак, сначала мы хотим, чтобы изображение отображалось по координатам (10, 10) и соответствовало ширине прямоугольного блока, который составляет 200 единиц ширины и 200 единиц высоты. Чтобы лучше визуализировать результат, сначала рисуем сам короб. Затем мы приступаем к созданию изображения (которое по сути представляет собой заполненный путь). Наконец, после получения заполнения пути и приведения его к XpsImageBrush, мы устанавливаем для свойства TileMode значение XpsTileMode.None.
Справа мы размещаем то же изображение, соответствующее высоте поля изображения. Обратите внимание на эффект мозаики.
Наконец, мы снова помещаем то же изображение справа и корректируем его так, чтобы оно соответствовало высоте и ширине поля изображения, что приводит к некоторому искажению изображения.
И вот результат в сохраненном файле XPS: