Использование графических утилит XPS | .NET

Как легко создавать простые фигуры в XPS

Спецификация XPS определяет графические примитивные элементы, которые можно использовать для создания любых сложных фигур. Aspose.Page для .NET предоставляет классы, инкапсулирующие эти элементы. Однако их использование может быть немного утомительным, когда вам нужно создать даже относительно простые фигуры, такие как круговой сектор или сегмент, или правильный n-угольник, вписанный в круг или описанный вокруг него. Даже нарисовать круг или эллипс не так просто, как могло бы и, наверное, должно быть. Именно поэтому Aspose.Page дополнительно предоставляет набор служебных методов, которые, скорее всего, сэкономят ваше время при выполнении подобных задач.

В следующем примере мы используем все доступные утилиты фигур. Обратите внимание, что все они возвращают объект XpsPathGeometry, который затем можно использовать для создания путей XPS. И для этих путей можно указать свойства внешнего вида — кисти, рисунок обводки, непрозрачность и т. д.

 1// For complete examples and data files, please go to https://github.com/aspose-page/Aspose.Page-for-.NET
 2// The path to the documents directory.
 3string dataDir = RunExamples.GetDataDir_WorkingWithShapes();
 4// Create new XPS Document
 5using (XpsDocument doc = new XpsDocument())
 6{
 7    // Set first page's size.
 8    doc.Page.Width = 650f;
 9    doc.Page.Height = 240f;
10
11    // Draw a circle with center (120, 120) and radius 100.
12    XpsPath path = doc.CreatePath(doc.Utils.CreateCircle(new PointF(120f, 120f), 100f));
13    path.Fill = doc.CreateSolidColorBrush(Color.Green);
14    doc.Add(path);
15
16    // Inscribe a regular pentagon in the circle.
17    path = doc.CreatePath(doc.Utils.CreateRegularInscribedNGon(5, new PointF(120f, 120f), 100f));
18    path.Fill = doc.CreateSolidColorBrush(Color.Red);
19    doc.Add(path);
20
21    // Circumscribe a regular hexagon around the circle.
22    path = doc.CreatePath(doc.Utils.CreateRegularCircumscribedNGon(6, new PointF(120f, 120f), 100f));
23    path.Stroke = doc.CreateSolidColorBrush(Color.Magenta);
24    path.StrokeThickness = 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.Utils.CreatePieSlice(new PointF(340f, 120f), 100f, -45f, 45f));
29    path.Stroke = doc.CreateSolidColorBrush(Color.Red);
30    path.StrokeThickness = 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.Utils.CreateCircularSegment(new PointF(340f, 120f), 100f, -45f, 45f));
35    path.Fill = 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.Utils.CreateRectangle(new RectangleF(530f, 20f, 100f, 200f)));
40    path.Stroke = 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.Utils.CreateEllipse(new PointF(580f, 120f), 50f, 100f));
45    path.Fill = doc.CreateSolidColorBrush(Color.Yellow);
46    doc.Add(path);
47
48    doc.Save(dataDir + "UseShapeUtilsXPS_out.xps");
49}

Начнем с нового документа XPS, затем настроим размер первой страницы. Первая фигура, которую мы размещаем на странице, представляет собой круг (заданный его центром и радиусом), залитый сплошным зеленым цветом. Далее вписываем в этот круг незаполненный красный правильный пятиугольник. Затем следует описанный правильный шестиугольник, обведенный пурпурным цветом.

Справа мы сначала рисуем красный круговой сектор (или «кусок пирога») между -45 и +45 градусами, а затем над сектором черный круговой сегмент с такими же параметрами.

Последняя часть рисунка состоит из красного прямоугольника (заданного верхней левой вершиной и размерами) и желтого эллипса (заданного центром и радиусами), вписанных в прямоугольник. Здесь мы контролируем надпись «вручную».

Вот что мы должны увидеть в сохраненном файле XPS:

Утилиты XPS shape

Как легко добавить изображение на страницу XPS

При использовании примитивов, определенных спецификацией XPS, добавление изображения на страницу состоит из двух шагов:

Но, к счастью, среди графических утилит XPS есть удобный метод Aspose.Page API для .NET, который может сделать всю (почти) всю работу за вас. Он также предлагает вам различные режимы посадки. Давайте посмотрим на пример ниже:

 1// For complete examples and data files, please go to https://github.com/aspose-page/Aspose.Page-for-.NET
 2// The path to the documents directory.
 3string dataDir = RunExamples.GetDataDir_WorkingWithImages();
 4// Create new XPS Document
 5using (XpsDocument doc = new XpsDocument())
 6{
 7    // Set first page's size.
 8    doc.Page.Width = 540f;
 9    doc.Page.Height = 220f;
10
11    // Draw the image box.
12    RectangleF imageBox = new RectangleF(10f, 10f, 200f, 200f);
13    XpsPath path = doc.AddPath(doc.Utils.CreateRectangle(imageBox));
14    path.Stroke = doc.CreateSolidColorBrush(Color.Black);
15    // Add an image to fit width.
16    path = doc.Utils.CreateImage(dataDir + "R08LN_NN.jpg", imageBox, ImageMode.FitToWidth);
17    // Prevent tiling.
18    ((XpsImageBrush)path.Fill).TileMode = XpsTileMode.None;
19    doc.Add(path);
20
21    // Add an image to fit width.
22    doc.Add(doc.Utils.CreateImage(dataDir + "R08LN_NN.jpg", new RectangleF(220f, 10f, 200f, 100f), ImageMode.FitToHeight));
23
24    // Add an image to fit width.
25    doc.Add(doc.Utils.CreateImage(dataDir + "R08LN_NN.jpg", new RectangleF(430f, 10f, 100f, 200f), ImageMode.FitToBox));
26
27    // Save resultant XPS document 
28    doc.Save(dataDir + "UseImageUtilsXPS.xps");
29}

Опять же, мы начинаем с нового документа XPS и корректируем размер первой страницы. Здесь стоит отметить, что по умолчанию ваше изображение, используемое в качестве кисти, будет располагаться по прямоугольной области так же, как если бы оно использовалось в режиме XpsTileMode.Tile. Однако в первой части примера мы покажем, как предотвратить такое разбиение.

Итак, сначала мы хотим, чтобы изображение появилось в точке (10, 10) и соответствовало ширине прямоугольного блока шириной 200 единиц и высотой 200 единиц. Чтобы увидеть результат нагляднее, сначала нарисуем сам ящик. Далее мы создаем изображение (обратите внимание, что на самом деле это заполненный путь). Наконец, после получения заполнения пути и приведения его к XpsImageBrush, мы устанавливаем для свойства TileMode значение XpsTileMode.None.

Справа мы размещаем то же изображение и подгоняем его по высоте к окну изображения. Обратите внимание на плитку.

Наконец, мы снова помещаем то же изображение справа и подгоняем его по высоте и ширине к окну изображения, что искажает изображение.

И вот результат в сохраненном файле XPS:

Утилиты для изображений XPS

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.