介绍
Aspose.PDF FOSS for 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 本身定位使用的相同方式描述边界框。两者都重写了从 Shape 继承的 CheckBounds(containerWidth, containerHeight),该方法报告形状当前的几何是否适合给定尺寸的容器。
#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 重写了来自 Shape 的 CheckBounds(containerWidth, containerHeight)。
#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 for C++ 在 MIT 许可证下发行,完整源代码可在 github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp 获取。该许可证允许商业使用、修改和再分发,无需单独协议。