Введение
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. Лицензия разрешает коммерческое использование, модификацию и распространение без отдельного соглашения.