Introducción

Aspose.PDF FOSS para C++ incluye un pequeño API de gráficos vectoriales para crear formas libres directamente en una página PDF. Esto es independiente de la ruta de renderizado raster de la biblioteca — BmpDevice, JpegDevice y TiffDevice, que convierten el contenido existente de la página a formatos de imagen — y en su lugar permite que un programa construya nueva geometría (círculos, elipses y líneas) en una página mientras se genera el documento.

El API se centra en un Graph, un contenedor que aloja un conjunto de objetos Shape y se coloca en una página de la misma forma que el resto del contenido de la página, mediante Page.Paragraphs(). Tres formas concretas derivan de la clase abstracta base Shape: Circle, Ellipse y Line, cada una expresando su geometría mediante un pequeño conjunto de propiedades numéricas en lugar de un tipo compartido de punto o rectángulo. El ancho del trazo, el color, el relleno y el patrón de guiones se establecen por forma a través de GraphInfo, y el propio contenedor Graph lleva un BorderInfo para enmarcar todo el contenedor.

Esta es una zona estrecha de la biblioteca — cinco clases que cubren la geometría y el estilo de las formas — destinada a programas que necesitan dibujar contenido geométrico simple (bordes, marcadores, líneas de conexión, círculos de resaltado) en una página sin construir una capa completa de dibujo vectorial o recurrir a la composición de imágenes.


Qué incluye

El contenedor de gráficos y agregar formas a una página

Graph contiene las formas dibujadas en una página. Sus propias propiedades — Left(), Top(), Width(), Height() y IsChangePosition() — posicionan y dimensionan el contenedor en la página, y Shapes() devuelve el vector de punteros a Shape que contiene. Las formas se añaden construyéndolas, estableciendo sus propiedades y agregándolas a ese vector; el propio Graph se añade a la página mediante 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");
}

Dibujando Círculos y Elipses

Circle y Ellipse describen su geometría con propiedades numéricas simples en lugar de un tipo compartido de punto o rectángulo. Circle expone PosX(), PosY() y Radius(); Ellipse expone Left(), Bottom(), Width() y Height(), describiendo una caja delimitadora con el mismo estilo que Graph usa para el posicionamiento. Ambas sobreescriben CheckBounds(containerWidth, containerHeight), heredado de Shape, que indica si la geometría actual de la forma cabe dentro de un contenedor del tamaño especificado.

#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);

Dibujando Líneas

Line almacena su geometría de forma diferente a Circle y Ellipse: PositionArray() devuelve un std::vector<float> plano de coordenadas — un par x, y para cada punto por el que pasa la línea — en lugar de un conjunto de propiedades nombradas. Un segmento de dos puntos se define con cuatro valores: x inicial, y inicial, x final, y final. Al igual que las demás formas, Line sobreescribe CheckBounds(containerWidth, containerHeight) de 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);

Estilizando Formas con GraphInfo y BorderInfo

El trazo y el relleno de cada forma provienen de un GraphInfo, leídos y establecidos mediante Shape.GraphInfo() / GraphInfo(value). GraphInfo expone el ancho del trazo (LineWidth()), el color del trazo y del relleno (Color(), FillColor()), un patrón de guiones (DashArray(), DashPhase()), una bandera de línea doble (IsDoubled()), y propiedades de sesgo/escala/rotación (SkewAngleX()/SkewAngleY(), ScalingRateX()/ScalingRateY(), RotationAngle()). El contenedor Graph también lleva un BorderInfo, configurado mediante Border(), que contiene un GraphInfo por cada borde — Left(), Right(), Top(), Bottom() — más un RoundedBorderRadius() para redondear el propio borde del contenedor.

#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);

Inicio rápido

Agregue la biblioteca como un subdirectorio de CMake y enlácela contra el objetivo aspose_pdf_foss:

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

Cree un documento, añada una página, dibuje un círculo dentro de un contenedor Graph y guarde el resultado:

#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");
}

Formatos compatibles

FormatoExtensiónLeerEscribir
BMP.bmp
JPEG.jpg
TIFF.tiff
Text.txt
SVG.svg

Estos formatos se aplican a la biblioteca en su conjunto — rasterización de página (BMP, JPEG, TIFF), extracción de texto (Text) e importación de SVG — en lugar de a las clases de gráficos vectoriales específicamente. Graph, Shape, Circle, Ellipse, y Line dibujan directamente en el contenido de la página PDF y no están vinculados a un formato de archivo propio.


Código abierto y licencias

Aspose.PDF FOSS para C++ se distribuye bajo la licencia MIT, con el código fuente completo disponible en github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp. La licencia permite el uso comercial, la modificación y la redistribución sin un acuerdo separado.


Primeros pasos

Recursos relacionados