Кодирование фигур векторной графики в файлах XPS
Решение API на C++ для работы с векторной графикой файлов XPS
XPS, как и другие языки описания страниц (Page Description Languages), позволяет работать с векторной графикой. Это решение C++ API включает манипулирование векторной графикой файлов XPS. Он предлагает широкий спектр функций, часть из которых проиллюстрирована во фрагменте кода (code snippet) здесь. Есть всего несколько примеров того, как добавить в файлы овальные и прямоугольные фигуры. Дополнительно вы узнаете, как управлять цветами этих фигур. Следуя этому методу, вы сможете создать любую нужную геометрическую фигуру.
Для работы с фигурами векторной графики (vector graphics shapes) XPS нам потребуются:
API Aspose.Page для C++, который представляет собой многофункциональный, мощный и простой в использовании API для управления документами и их преобразования для платформы C++.
Вы можете загрузить последнюю версию напрямую: просто откройте диспетчер пакетов NuGet, найдите Aspose.Page.Cpp и установите. Вы также можете использовать следующую команду в консоли диспетчера пакетов (Package Manager Console).
Package Manager Console Command
PM> Install-Package Aspose.Page.Cpp
Шаги по добавлению прямоугольника с помощью C++.
- Сначала задайте путь к каталогу, в котором будет сохранен документ.
- Создайте файл XPS путем создания экземпляра (instantiating) класса XpsDocument Class .
- Используйте методы класса XpsPath для создания прямоугольника.
- Наконец, сохраните измененный документ XPS, вызвав метод XPsDocument.Save.
Добавить прямоугольник
// The path to the documents directory.
System::String dataDir = RunExamples::GetDataDir_WorkingWithShapes();
// Create new XPS Document
System::SharedPtr<XpsDocument> doc = System::MakeObject<XpsDocument>();
// CMYK (blue) solid color stroked rectangle in the lower left
System::SharedPtr<XpsPath> path = doc->AddPath(doc->CreatePathGeometry(u"M 20,10 L 220,10 220,100 20,100 Z"));
path->set_Stroke(doc->CreateSolidColorBrush(doc->CreateColor(dataDir + u"uswebuncoated.icc", System::MakeArray<float>({1.0f, 1.000f, 0.000f, 0.000f, 0.000f}))));
path->set_StrokeThickness(12.f);
// Save resultant XPS document
doc->Save(dataDir + u"output/" + u"AddRectangleXPS_out.xps");Добавить эллипс с помощью C++.
Чтобы добавить эллипс или другую фигуру в файл XPS, вам нужно будет предпринять аналогичные шаги и использовать те же сущности (entities), что и для добавления прямоугольника.
Добавить эллипс
// The path to the documents directory.
System::String dataDir = RunExamples::GetDataDir_WorkingWithShapes();
// Create new XPS Document
System::SharedPtr<XpsDocument> doc = System::MakeObject<XpsDocument>();
// Radial gradient stroked ellipse in the lower left
System::SharedPtr<System::Collections::Generic::List<System::SharedPtr<XpsGradientStop>>> stops = System::MakeObject<System::Collections::Generic::List<System::SharedPtr<XpsGradientStop>>>();
stops->Add(doc->CreateGradientStop(doc->CreateColor(0, 0, 255), 0.f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(255, 0, 0), .25f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(0, 255, 0), .5f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(255, 255, 0), .75f));
stops->Add(doc->CreateGradientStop(doc->CreateColor(255, 0, 0), 1.f));
System::SharedPtr<XpsPath> path = doc->AddPath(doc->CreatePathGeometry(u"M 20,250 A 100,50 0 1 1 220,250 100,50 0 1 1 20,250"));
path->set_Stroke(doc->CreateRadialGradientBrush(System::Drawing::PointF(575.f, 125.f), System::Drawing::PointF(575.f, 100.f), 75.f, 50.f));
(System::ExplicitCast<Aspose::Page::XPS::XpsModel::XpsGradientBrush>(path->get_Stroke()))->set_SpreadMethod(Aspose::Page::XPS::XpsModel::XpsSpreadMethod::Reflect);
(System::ExplicitCast<Aspose::Page::XPS::XpsModel::XpsGradientBrush>(path->get_Stroke()))->get_GradientStops()->AddRange(stops);
stops->Clear();
path->set_StrokeThickness(12.f);
// Save resultant XPS document
doc->Save(dataDir + u"output/" + u"AddEllipse_outXPS.xps");XPS Формат файла XPS
XPS (XML Paper Specification) — альтернативный Microsoft формат PDF, основанный на XML/HTML, сохраняет макет независимо от платформы.