Введение

Aspose.PDF FOSS для C++ включает небольшую векторную графическую API для построения произвольных фигур непосредственно на странице PDF. Это отдельно от растерного пути библиотеки— BmpDevice, JpegDevice и TiffDevice, которые преобразуют существующее содержимое страницы в форматы изображений— и вместо этого позволяет программе создавать новую геометрию (круги, эллипсы и линии) на странице во время генерации документа.

API сосредоточен вокруг Graph— контейнера, который хранит набор объектов Shape и размещается на странице так же, как другое содержимое страницы, через Page.Paragraphs(). Три конкретных фигуры наследуются от абстрактного базового класса Shape: Circle, Ellipse и Line, каждая из которых описывает свою геометрию небольшим набором числовых свойств, а не общим типом точки или прямоугольника. Ширина линии, цвет, заливка и шаблон штриха задаются для каждой фигуры через GraphInfo, а сам контейнер Graph несёт BorderInfo для обрамления всего контейнера.

Это узкая часть библиотеки — пять классов, охватывающих геометрию фигур и их стилизацию — предназначена для программ, которым необходимо рисовать простое геометрическое содержимое (границы, маркеры, соединительные линии, выделяющие круги) на странице без создания полноценного слоя векторного рисования или перехода к композитингу изображений.


Что включено

Контейнер графа и добавление фигур на страницу

Graph хранит фигуры, нарисованные на странице. Его собственные свойства— Left(), Top(), Width(), Height() и IsChangePosition()— определяют положение и размер контейнера на странице, а Shapes() возвращает вектор указателей на Shape, которые он содержит. Фигуры добавляются путём их создания, установки свойств и добавления в этот вектор; сам Graph добавляется на страницу через Page.Paragraphs().Add().

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/graph.hpp>
#include <aspose/pdf/circle.hpp>

using namespace Aspose::Pdf;

int main() {
    Document doc;
    Page page = doc.Pages().Add();

    auto graph = std::make_shared<Graph>();
    graph->Left(50.0);
    graph->Top(50.0);
    graph->Width(400.0);
    graph->Height(400.0);

    auto circle = std::make_unique<Circle>();
    circle->PosX(200.0);
    circle->PosY(200.0);
    circle->Radius(75.0);
    graph->Shapes().push_back(std::move(circle));

    page.Paragraphs().Add(graph);
    doc.Save("graph.pdf");
}

Рисование кругов и эллипсов

Circle и Ellipse описывают свою геометрию обычными числовыми свойствами вместо общего типа точки или прямоугольника. Circle раскрывает PosX(), PosY() и Radius(); Ellipse раскрывает Left(), Bottom(), Width() и Height(), описывая ограничивающий прямоугольник в том же стиле, который использует Graph для позиционирования. Обе переопределяют CheckBounds(containerWidth, containerHeight), унаследованный от Shape, который сообщает, помещается ли текущая геометрия фигуры внутри контейнера указанного размера.

#include <aspose/pdf/circle.hpp>
#include <aspose/pdf/ellipse.hpp>

using namespace Aspose::Pdf;

Circle circle;
circle.PosX(150.0);
circle.PosY(150.0);
circle.Radius(50.0);
bool circleFits = circle.CheckBounds(400.0, 400.0);

Ellipse ellipse;
ellipse.Left(20.0);
ellipse.Bottom(20.0);
ellipse.Width(120.0);
ellipse.Height(60.0);
bool ellipseFits = ellipse.CheckBounds(400.0, 400.0);

Рисование линий

Line хранит свою геометрию иначе, чем Circle и Ellipse: PositionArray() возвращает плоский std::vector<float> координат— пару x, y для каждой точки, через которую проходит линия— вместо набора именованных свойств. Сегмент из двух точек задаётся четырьмя значениями: начальный x, начальный y, конечный x, конечный y. Как и остальные фигуры, Line переопределяет CheckBounds(containerWidth, containerHeight) из Shape.

#include <aspose/pdf/line.hpp>

using namespace Aspose::Pdf;

Line line;
line.PositionArray({50.0f, 50.0f, 350.0f, 350.0f});
bool lineFits = line.CheckBounds(400.0, 400.0);

Стилизация фигур с помощью GraphInfo и BorderInfo

Каждая линия и заливка фигуры берутся из GraphInfo, читаются и задаются через Shape.GraphInfo() / GraphInfo(value). GraphInfo предоставляет ширину линии (LineWidth()), цвет линии и заливки (Color(), FillColor()), шаблон штриховки (DashArray(), DashPhase()), флаг двойной линии (IsDoubled()), а также свойства наклона/масштаба/вращения (SkewAngleX()/SkewAngleY(), ScalingRateX()/ScalingRateY(), RotationAngle()). Контейнер Graph также содержит BorderInfo, задаваемый через Border(), который хранит по одному GraphInfo для каждой грани — Left(), Right(), Top(), Bottom() — и параметр RoundedBorderRadius() для скругления самой границы контейнера.

#include <aspose/pdf/graph_info.hpp>
#include <aspose/pdf/border_info.hpp>
#include <aspose/pdf/color.hpp>

using namespace Aspose::Pdf;

GraphInfo stroke;
stroke.LineWidth(2.0f);
stroke.Color(Color::FromRgb(1.0, 0.0, 0.0));
stroke.FillColor(Color::FromRgb(1.0, 0.9, 0.9));
stroke.DashArray({4, 2});

BorderInfo border{BorderSide::All, 1.5f, Color::Black()};
border.RoundedBorderRadius(6.0);

Быстрый старт

Добавьте библиотеку как подкаталог CMake и свяжите её с целью aspose_pdf_foss:

add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)

Создайте документ, добавьте страницу, нарисуйте круг внутри контейнера Graph и сохраните результат:

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/graph.hpp>
#include <aspose/pdf/circle.hpp>

using namespace Aspose::Pdf;

int main() {
    Document doc;
    Page page = doc.Pages().Add();

    auto graph = std::make_shared<Graph>();
    graph->Left(50.0);
    graph->Top(50.0);
    graph->Width(300.0);
    graph->Height(300.0);

    auto circle = std::make_unique<Circle>();
    circle->PosX(150.0);
    circle->PosY(150.0);
    circle->Radius(100.0);
    graph->Shapes().push_back(std::move(circle));

    page.Paragraphs().Add(graph);
    doc.Save("circle.pdf");
}

Поддерживаемые форматы

ФорматРасширениеЧтениеЗапись
BMP.bmp
JPEG.jpg
TIFF.tiff
Text.txt
SVG.svg

Эти форматы применяются ко всей библиотеке— растеризация страниц (BMP, JPEG, TIFF), извлечение текста (Text) и импорт SVG— а не конкретно к классам векторной графики. Graph, Shape, Circle, Ellipse и Line рисуют непосредственно в содержимое PDF-страницы и не привязаны к какому-либо собственному формату файла.


Открытый исходный код и лицензирование

Aspose.PDF FOSS для C++ распространяется под лицензией MIT, полный исходный код доступен по адресу github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp. Лицензия разрешает коммерческое использование, модификацию и распространение без отдельного соглашения.


Начало работы

Связанные ресурсы