Rita vektorgrafik på en PDF-sida

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 CheckBounds mot den ägande Graph:s egna Width()/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 till Graph till Page.Paragraphs() — att konstruera en Circle, Ellipse eller Line har ingen synlig effekt förrän den både har bifogats till sin ägande Graph och den Graph har lagts till på en sida.
  • Gruppera relaterade former under ett enda Graph snarare än ett Graph per form; Left()/Top()/Width()/Height() positionerar hela behållaren en gång, och varje form i Shapes() ritas relativt till den.
  • Ange Shape.GraphInfo() explicit för former som behöver en synlig fyllning eller en icke-standardlinje — standard-GraphInfo har en 1.0f linjebredd, ingen fyllning och en tom DashArray().
  • Bygg Line.PositionArray() som x0, 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

ProblemOrsakÅtgärd
En Circle, Ellipse eller Line visas aldrig på den sparade sidanFormen konstruerades men lades aldrig till dess Graphs Shapes(), eller så lades Graph aldrig till sidanPlacera formen på graph->Shapes() och anropa page.Paragraphs().Add(graph)
Formen ritas med en standard tunn svart linjeShape.GraphInfo() sattes aldrigAnropa shape->GraphInfo(customGraphInfo) innan du lägger till formen i Shapes()
Line saknas eller ser ut som en enda punktPositionArray() har färre än två (x, y)-par, eller ett udda antal värdenAnge minst fyra värden som x0, y0, x1, y1
Endast vissa kanter av behållarens ram är styladeBorderInfo konstruerades med en BorderSide-mask som utesluter vissa kanterAnvänd BorderSide::All, eller OR:a ihop alla nödvändiga BorderSide-flaggor
CheckBounds returnerar oväntat falseDimensionerna som skickas till CheckBounds matchar inte den container som formen faktiskt ritas iSkicka 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/MetodBeskrivning
GraphFormcontainer 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
ShapeAbstrakt 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
CircleCirkelform: PosX(), PosY(), Radius()
EllipseEllipsform: begränsningsruta via Left(), Bottom(), Width(), Height()
LineLinje-/sökvägsform: PositionArray(), en platt std::vector<float> av x, y-koordinater
GraphInfoStreck-/fyllningsstil: LineWidth(), Color(), FillColor(), DashArray(), DashPhase(), IsDoubled(), RotationAngle(), SkewAngleX()/SkewAngleY(), ScalingRateX()/ScalingRateY()
BorderInfoKantlinje per kant för behållare: Left(), Right(), Top(), Bottom() (varje en GraphInfo), plus RoundedBorderRadius()
BorderSideEnum för att välja kanter vid konstruktion av en BorderInfo: None, Left, Top, Right, Bottom, All, Box

Se även

 Svenska