Vektoros grafikák rajzolása PDF oldalon

Vektoros grafikák rajzolása PDF oldalon

Vektorgrafikák rajzolása PDF oldalon

Aspose.PDF FOSS for C++ tartalmaz egy kis vektorgrafikai API eszközt alakzatok közvetlen PDF oldalra való rajzolásához, miközben a dokumentum épül. A belépési pont a Graph, egy konténer, amely egy oldalon helyezkedik el, és Shape objektumok gyűjteményét tartja; három konkrét alakzat — Circle, Ellipse és Line — a Shape-ből származik, és mindegyik másként fejezi ki a geometriáját. Az alakzatonkénti vonal- és kitöltésstílus a GraphInfo-ből származik, a Graph konténer pedig BorderInfo-t hordoz a keretezéshez. Ez nem kapcsolódik az oldal rasterizációjához (BmpDevice, JpegDevice, TiffDevice), amely a meglévő oldal tartalmat raster képformátumokká alakítja, nem új geometriát rajzol.


A Grafikon Konténer és Alakzatok Hozzáadása Az Oldalra

Graph a pozícióját és méretét az oldalon a Left(), Top(), Width() és Height() segítségével állítja be, és a IsChangePosition() jelzője szabályozza, hogy ez a pozíció eltolható-e a többi oldal tartalomhoz képest. Az általa rajzolt alakzatok a Shapes() által visszaadott vektorban élnek — std::vector<std::unique_ptr<Shape>> — amelyet egy alakzat létrehozásával, konfigurálásával és a vektorra helyezésével töltünk fel. Miután felépült, a Graph maga is az oldalon kerül elhelyezésre a Page.Paragraphs().Add() segítségével, amely ugyanaz a gyűjtemény, mint a többi oldal-szintű tartalomhoz.

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

Körök és Ellipszisek Rajzolása

Circle és Ellipse minden esetben a geometriát egyszerű numerikus tulajdonságokként fejezik ki, nem közös pont vagy téglalap típusként. Circle egy középpont és sugár — PosX(), PosY(), Radius() — míg Ellipse egy határoló keret — Left(), Bottom(), Width(), Height(). Mindkettő a Shape-től örökli a CheckBounds(containerWidth, containerHeight)-et, amely jelzi, hogy az alakzat jelenlegi geometriája belefér-e egy adott méretű konténerbe anélkül, hogy maga az alakzat módosulna.

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

Vonalak rajzolása a PositionArray segítségével

Line a geometriáját másként tárolja, mint a Circle és a Ellipse: PositionArray() egy lapos std::vector<float> visszaad, amely x, y párost tartalmaz minden pontnál, amelyen a vonal áthalad, a névvel ellátott tulajdonságok rögzített halmaza helyett. Két pont (négy érték) egy egyenes szegmenst rajzol; további párok több szegmensből álló útvonalat hoznak létre ezen pontok sorrendjében. A többi alakhoz hasonlóan a Line felülírja a CheckBounds(containerWidth, containerHeight) -t a Shape-től.

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

Alakzatok stílusozása a GraphInfo és a BorderInfo segítségével

Minden alakzat a Shape.GraphInfo() / GraphInfo(value) segítségével olvassa és írja a körvonal és kitöltés stílusát. A GraphInfo alapértelmezés szerint egy LineWidth() 1.0f értékkel és egy üres DashArray() rendelkezik, továbbá elérhetővé teszi a Color(), FillColor(), DashArray()/DashPhase() pontozott vonalakhoz, a IsDoubled() duplaszélességű vonalhoz, valamint a SkewAngleX()/SkewAngleY(), ScalingRateX()/ScalingRateY() és RotationAngle() a körvonal átalakításához. A Graph maga egy BorderInfo tartalmaz, amely a Border() révén van beállítva, és egy GraphInfo csoportosít minden élhez — Left(), Right(), Top(), Bottom() — plusz egy RoundedBorderRadius(), és létrehozható azzal, hogy megnevezzük, mely éleket kell stílusozni egy BorderSide zászlóval (BorderSide::Left | BorderSide::Right, vagy BorderSide::All minden élhez).

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

Tippek és bevált gyakorlatok

  • Hívd meg a CheckBounds a tulajdonos Graph saját Width()/Height() értékével, ne a teljes oldalmédia dobozzal — az ellenőrzés a forma geometriáját az általad megadott konténermérettel validálja, és nem nézi automatikusan az oldalt.
  • Adj hozzá alakzatokat a Shapes()hez, mielőtt a Grapht a Page.Paragraphs()hez adnád — egy Circle, Ellipse vagy Line felépítése nem lesz látható hatása, amíg nem kerül hozzá a saját Graphhez, és az a Graph sem kerül egy oldalra.
  • Csoportosítsd a kapcsolódó alakzatokat egyetlen Graph alatt, ahelyett, hogy minden alakzathoz külön Graph lenne; a Left()/Top()/Width()/Height() egyszer pozícionálja az egész konténert, és a Shapes() minden alakzata ehhez viszonyítva kerül kirajzolásra.
  • Állítsd be a Shape.GraphInfo() értékét kifejezetten azoknál az alakzatoknál, amelyeknek látható kitöltésre vagy nem alapértelmezett körvonalra van szükségük — az alapértelmezett GraphInfo 1.0f vonalvastagsággal, kitöltés nélkül és egy üres DashArray() értékkel rendelkezik.
  • Építsd fel a Line.PositionArray()-t x0, y0, x1, y1, … párokként abban a sorrendben, ahogyan az útvonalat rajzolni kell — a páratlan hosszúságú vektor egy hiányos pontot ír le.

Gyakori problémák

ProblémaOkJavítás
A Circle, Ellipse vagy a Line soha nem jelenik meg a mentett oldalonAz alakzat létre lett hozva, de soha nem lett hozzáfűzve a Graph Shapes() eleméhez, vagy a Graph soha nem lett hozzáadva az oldalhozTűzd az alakzatot a graph->Shapes() elemre, és hívd meg a page.Paragraphs().Add(graph)
Az alakzat alapértelmezett vékony fekete vonallal kerül megrajzolásraShape.GraphInfo() soha nem lett beállítvaHívja meg a(z) shape->GraphInfo(customGraphInfo) a forma Shapes()-hez való hozzáadása előtt
Line hiányzik vagy egyetlen pontnak tűnikPositionArray() kevesebb, mint két (x, y) párt tartalmaz, vagy páratlan számú értékkel rendelkezikAdjon meg legalább négy értéket x0, y0, x1, y1ként
A tároló szegélyének csak egyes élei vannak stílusozvaBorderInfo egy BorderSide maszkkal lett felépítve, amely kizár néhány éltHasználja a(z) BorderSide::All értéket, vagy logikai VAGY-vel kombinálja a szükséges minden BorderSide jelzőt
CheckBounds váratlanul false értéket ad visszaA CheckBounds-nak átadott méretek nem egyeznek azzal a konténerrel, amelyben a forma valójában meg van rajzolvaAddja át a tulajdonos Graph jelenlegi Width()/Height() értékét

FAQ

Mi a különbség a Circle és a AnnotationType::Circle között?

Circle (ez az útmutató) egy rajzoló alakzat, amely közvetlenül a lap tartalmába rajzol egy Graph segítségével. AnnotationType::Circle és CircleAnnotation egy külön annotációs API-hez tartoznak, és egy kör alakú markup annotációt képviselnek — a kettő nem kapcsolódik egymáshoz a közös név ellenére.

Egyetlen Graph tartalmazhat több, mint egy alakzatot?

Igen. A Graph.Shapes() visszaadja a teljes std::vector<std::unique_ptr<Shape>>-t az adott tárolóhoz, és a Circle, Ellipse és Line példányok bármilyen keveréke hozzáfűzhető, mielőtt a Graph hozzáadódik az oldalhoz.

A Circle és az Ellipse közös geometriai típust használnak?

No. Circle egy középpont és sugár (PosX, PosY, Radius); Ellipse egy határoló doboz (Left, Bottom, Width, Height). Mindkettő a Shape-ből származik, de egyik sem oszt közös pontot vagy téglalap típusú elemet a másikkal.

Ugyanaz-e a formák rajzolása a Graph segítségével, mint egy oldal képpé renderelése?

Nem. Graph, Shape, Circle, Ellipse és Line új vektorgéometriát építenek az oldal tartalmába a dokumentum generálása során. Egy meglévő oldal raszterképpé konvertálása egy külön képesség, amelyet a BmpDevice, JpegDevice és TiffDevice kezel.

Mit csinál a GraphInfo.IsDoubled()?

Ez a vonalat duplán vonalúként jelöli meg, anélkül hogy bármely más vonal tulajdonságot módosítaná. Ez egy boolean jelző, amelyet a IsDoubled() / IsDoubled(value) olvas és állít be a többi GraphInfo vonal tulajdonsággal együtt.


API Reference Összefoglaló

Osztály/MódszerLeírás
GraphAlakzat konténer, amely egy oldalon helyezkedik el; saját magát Left(), Top(), Width() és Height() segítségével pozicionálja
Graph.Shapes()Visszaadja a konténer által rajzolt std::vector<std::unique_ptr<Shape>> értéket
Graph.GraphInfo() / GraphInfo(value)Lekéri/beállítja a tároló saját vonal- és kitöltési stílusát
Graph.Border() / Border(value)Lekéri/beállítja a BorderInfo-t, amely a tárolót keretezi
ShapeAbsztrakt alaposztály a Circle, Ellipse és Line számára; elérhetővé teszi a GraphInfo() és a CheckBounds() elemeket
Shape.CheckBounds(w, h)Jelentést ad arról, hogy az alakzat geometriája illeszkedik-e a megadott szélesség/magasságú tárolóba
CircleKör alak: PosX(), PosY(), Radius()
EllipseEllipszis alak: határoló doboz Left(), Bottom(), Width(), Height()
LineVonal/útvonal alak: PositionArray(), egy sík std::vector<float> x, y koordinátákkal
GraphInfoVonal-/kitöltés stílus: LineWidth(), Color(), FillColor(), DashArray(), DashPhase(), IsDoubled(), RotationAngle(), SkewAngleX()/SkewAngleY(), ScalingRateX()/ScalingRateY()
BorderInfoÉlszintű konténerkeret: Left(), Right(), Top(), Bottom() (mindegyik egy GraphInfo), plusz RoundedBorderRadius()
BorderSideAz éleket kiválasztó felsoroló (enum) egy BorderInfo felépítésekor: None, Left, Top, Right, Bottom, All, Box

Lásd még:

 Magyar