Rita vektorgrafik på en PDF-sida
Rita vektorgrafik på en PDF-sida
Aspose.PDF FOSS för C++ inkluderar en liten vektorgrafik API för att rita former direkt på en PDF-sida medan ett dokument byggs. Ingångspunkten är Graph, en behållare placerad på en sida som håller en samling av Shape-objekt; tre konkreta former — Circle, Ellipse och Line — härstammar från Shape och uttrycker var sin geometri på olika sätt. Strok- och fyllningsstil per form kommer från GraphInfo, och Graph-behållaren själv har en BorderInfo för ramning. Detta är orelaterat till sidrastrering (BmpDevice, JpegDevice, TiffDevice), som konverterar befintligt sidinnehåll till rasterbildformat snarare än att rita ny geometri.
Grafbehållaren och att lägga till former på en sida
Graph positionerar och storlekar sig själv på sidan via Left(), Top(), Width() och Height(), och dess IsChangePosition()-flagga styr om den positionen kan förskjutas i förhållande till annat sidinnehåll. Formerna den ritar finns i vektorn som returneras av Shapes() — std::vector<std::unique_ptr<Shape>> — som fylls genom att konstruera en form, konfigurera den och flytta den till den vektorn. När den är byggd placeras Graph själv på sidan via Page.Paragraphs().Add(), samma samling som används för annat sidnivåinnehåll.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/drawing/graph.hpp>
#include <aspose/pdf/drawing/circle.hpp>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Drawing;
Document doc;
Page page = doc.Pages().Add();
auto graph = std::make_shared<Graph>();
graph->Left(36.0);
graph->Top(36.0);
graph->Width(500.0);
graph->Height(300.0);
auto marker = std::make_unique<Circle>();
marker->PosX(60.0);
marker->PosY(60.0);
marker->Radius(30.0);
graph->Shapes().push_back(std::move(marker));
page.Paragraphs().Add(graph);
doc.Save("shapes.pdf");Rita cirklar och ellipser
Circle och Ellipse uttrycker var och en geometri som enkla numeriska egenskaper snarare än en gemensam punkt- eller rektangeltyp. Circle är en mittpunkt och radie — PosX(), PosY(), Radius() — medan Ellipse är en omgivningsruta — Left(), Bottom(), Width(), Height(). Båda ärver CheckBounds(containerWidth, containerHeight) från Shape, som rapporterar om figurens nuvarande geometri får plats i en behållare av given storlek utan att förändra själva figuren.
#include <aspose/pdf/drawing/circle.hpp>
#include <aspose/pdf/drawing/ellipse.hpp>
using namespace Aspose::Pdf::Drawing;
Circle circle;
circle.PosX(120.0);
circle.PosY(120.0);
circle.Radius(60.0);
bool circleFits = circle.CheckBounds(500.0, 300.0);
Ellipse ellipse;
ellipse.Left(220.0);
ellipse.Bottom(20.0);
ellipse.Width(250.0);
ellipse.Height(100.0);
bool ellipseFits = ellipse.CheckBounds(500.0, 300.0);Rita linjer med PositionArray
Line lagrar sin geometri annorlunda än Circle och Ellipse: PositionArray() returnerar en platt std::vector<float> som innehåller ett x, y-par för varje punkt linjen passerar, snarare än en fast uppsättning namngivna egenskaper. Två punkter (fyra värden) ritar ett rakt segment; ytterligare par ritar en flersegmentsväg genom dessa punkter i ordning. Precis som de andra formerna, Line åsidosätter CheckBounds(containerWidth, containerHeight) från Shape.
#include <aspose/pdf/drawing/line.hpp>
using namespace Aspose::Pdf::Drawing;
Line path;
path.PositionArray({0.0f, 0.0f, 250.0f, 0.0f, 125.0f, 200.0f});
bool pathFits = path.CheckBounds(500.0, 300.0);Styla former med GraphInfo och BorderInfo
Varje form läser och skriver sin linje- och fyllningsstil via Shape.GraphInfo() / GraphInfo(value). GraphInfo har som standard en LineWidth() av 1.0f med en tom DashArray(), och exponerar också Color(), FillColor(), DashArray()/DashPhase() för streckade linjer, IsDoubled() för en dubbel linje, samt SkewAngleX()/SkewAngleY(), ScalingRateX()/ScalingRateY() och RotationAngle() för att transformera linjen. Graph i sig bär en BorderInfo, satt via Border(), som grupperar en GraphInfo per kant — Left(), Right(), Top(), Bottom() — plus en RoundedBorderRadius(), och kan konstrueras genom att ange vilka kanter som ska stylas med en BorderSide flagga (BorderSide::Left | BorderSide::Right, eller BorderSide::All för varje kant).
#include <aspose/pdf/graph_info.hpp>
#include <aspose/pdf/border_info.hpp>
#include <aspose/pdf/border_side.hpp>
#include <aspose/pdf/color.hpp>
using namespace Aspose::Pdf;
GraphInfo stroke;
stroke.LineWidth(2.5f);
stroke.Color(Color::FromRgb(1.0, 0.0, 0.0));
stroke.DashArray({3, 2});
stroke.DashPhase(1);
stroke.IsDoubled(true);
// Style only the left and right edges of the container border.
BorderInfo border{BorderSide::Left | BorderSide::Right, 3.0f};
border.RoundedBorderRadius(4.0);
graph->GraphInfo(stroke);
graph->Border(border);Tips och bästa praxis
- Anropa
CheckBoundsmot den ägandeGraph:s egnaWidth()/Height(), inte sidans fulla mediabox — kontrollen validerar en forms geometri mot den behållarstorlek du anger, den tittar inte automatiskt på sidan. - Lägg till former i
Shapes()innan du lägger tillGraphtillPage.Paragraphs()— att konstruera enCircle,EllipseellerLinehar ingen synlig effekt förrän den både har bifogats till sin ägandeGraphoch denGraphhar lagts till på en sida. - Gruppera relaterade former under ett enda
Graphsnarare än ettGraphper form;Left()/Top()/Width()/Height()positionerar hela behållaren en gång, och varje form iShapes()ritas relativt till den. - Ange
Shape.GraphInfo()explicit för former som behöver en synlig fyllning eller en icke-standardlinje — standard-GraphInfohar en1.0flinjebredd, ingen fyllning och en tomDashArray(). - Bygg
Line.PositionArray()somx0, y0, x1, y1, …par i den ordning som vägen ska ritas — en vektorre som har udda längd beskriver en ofullständig punkt.
Vanliga problem
| Problem | Orsak | Åtgärd |
|---|---|---|
En Circle, Ellipse eller Line visas aldrig på den sparade sidan | Formen konstruerades men lades aldrig till dess Graphs Shapes(), eller så lades Graph aldrig till sidan | Placera formen på graph->Shapes() och anropa page.Paragraphs().Add(graph) |
| Formen ritas med en standard tunn svart linje | Shape.GraphInfo() sattes aldrig | Anropa shape->GraphInfo(customGraphInfo) innan du lägger till formen i Shapes() |
Line saknas eller ser ut som en enda punkt | PositionArray() har färre än två (x, y)-par, eller ett udda antal värden | Ange minst fyra värden som x0, y0, x1, y1 |
| Endast vissa kanter av behållarens ram är stylade | BorderInfo konstruerades med en BorderSide-mask som utesluter vissa kanter | Använd BorderSide::All, eller OR:a ihop alla nödvändiga BorderSide-flaggor |
CheckBounds returnerar oväntat false | Dimensionerna som skickas till CheckBounds matchar inte den container som formen faktiskt ritas i | Skicka den ägande Graph:s aktuella Width()/Height() |
FAQ
Vad är skillnaden mellan Circle och AnnotationType::Circle?
Circle (denna guide) är en ritningsform som ritar direkt i sidinnehållet via en Graph. AnnotationType::Circle och CircleAnnotation tillhör en separat annotering API och representerar en cirkelformad markup-annotering istället — de två är orelaterade trots det gemensamma namnet.
Kan en enda Graph innehålla mer än en form?
Ja. Graph.Shapes() returnerar hela std::vector<std::unique_ptr<Shape>> för den behållaren, och en blandning av Circle, Ellipse och Line-instanser kan läggas till den innan Graph läggs till på sidan.
Delar Circle och Ellipse samma geometrityp?
Nej. Circle är en mittpunkt och radie (PosX, PosY, Radius); Ellipse är en avgränsningsruta (Left, Bottom, Width, Height). Båda härstammar från Shape, men ingen av dem delar en gemensam punkt eller rektangulär typ med den andra.
Är detsamma att rita former med Graph som att rendera en sida till en bild?
Nej. Graph, Shape, Circle, Ellipse och Line bygger ny vektorgrafik i sidans innehåll medan dokumentet genereras. Att konvertera en befintlig sida till en rasterbild är en separat funktion, som hanteras av BmpDevice, JpegDevice och TiffDevice.
Vad gör GraphInfo.IsDoubled()?
Den markerar strecket som en dubbellinje snarare än att ändra någon annan streckegenskap. Det är en boolesk flagga som läses och sätts via IsDoubled() / IsDoubled(value) tillsammans med de andra GraphInfo streckegenskaperna.
API Reference Sammanfattning
| Klass/Metod | Beskrivning |
|---|---|
Graph | Formcontainer placerad på en sida; positionerar sig själv med Left(), Top(), Width(), Height() |
Graph.Shapes() | Returnerar std::vector<std::unique_ptr<Shape>> som ritas av denna container |
Graph.GraphInfo() / GraphInfo(value) | Hämtar/inställer behållarens egna stroke- och fill-styling |
Graph.Border() / Border(value) | Hämtar/inställer BorderInfo som ramar in behållaren |
Shape | Abstrakt bas för Circle, Ellipse och Line; exponerar GraphInfo() och CheckBounds() |
Shape.CheckBounds(w, h) | Rapporterar om figurens geometri får plats i en behållare med given bredd/höjd |
Circle | Cirkelform: PosX(), PosY(), Radius() |
Ellipse | Ellipsform: begränsningsruta via Left(), Bottom(), Width(), Height() |
Line | Linje-/sökvägsform: PositionArray(), en platt std::vector<float> av x, y-koordinater |
GraphInfo | Streck-/fyllningsstil: LineWidth(), Color(), FillColor(), DashArray(), DashPhase(), IsDoubled(), RotationAngle(), SkewAngleX()/SkewAngleY(), ScalingRateX()/ScalingRateY() |
BorderInfo | Kantlinje per kant för behållare: Left(), Right(), Top(), Bottom() (varje en GraphInfo), plus RoundedBorderRadius() |
BorderSide | Enum för att välja kanter vid konstruktion av en BorderInfo: None, Left, Top, Right, Bottom, All, Box |