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
CheckBoundsa tulajdonosGraphsajátWidth()/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 aGrapht aPage.Paragraphs()hez adnád — egyCircle,EllipsevagyLinefelépítése nem lesz látható hatása, amíg nem kerül hozzá a sajátGraphhez, és az aGraphsem kerül egy oldalra. - Csoportosítsd a kapcsolódó alakzatokat egyetlen
Graphalatt, ahelyett, hogy minden alakzathoz különGraphlenne; aLeft()/Top()/Width()/Height()egyszer pozícionálja az egész konténert, és aShapes()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értelmezettGraphInfo1.0fvonalvastagsággal, kitöltés nélkül és egy üresDashArray()értékkel rendelkezik. - Építsd fel a
Line.PositionArray()-tx0, 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éma | Ok | Javítás |
|---|---|---|
A Circle, Ellipse vagy a Line soha nem jelenik meg a mentett oldalon | Az 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 oldalhoz | Tű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ásra | Shape.GraphInfo() soha nem lett beállítva | Hívja meg a(z) shape->GraphInfo(customGraphInfo) a forma Shapes()-hez való hozzáadása előtt |
Line hiányzik vagy egyetlen pontnak tűnik | PositionArray() kevesebb, mint két (x, y) párt tartalmaz, vagy páratlan számú értékkel rendelkezik | Adjon meg legalább négy értéket x0, y0, x1, y1ként |
| A tároló szegélyének csak egyes élei vannak stílusozva | BorderInfo egy BorderSide maszkkal lett felépítve, amely kizár néhány élt | Haszná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 vissza | A CheckBounds-nak átadott méretek nem egyeznek azzal a konténerrel, amelyben a forma valójában meg van rajzolva | Addja á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ódszer | Leírás |
|---|---|
Graph | Alakzat 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 |
Shape | Absztrakt 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 |
Circle | Kör alak: PosX(), PosY(), Radius() |
Ellipse | Ellipszis alak: határoló doboz Left(), Bottom(), Width(), Height() |
Line | Vonal/útvonal alak: PositionArray(), egy sík std::vector<float> x, y koordinátákkal |
GraphInfo | Vonal-/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() |
BorderSide | Az éleket kiválasztó felsoroló (enum) egy BorderInfo felépítésekor: None, Left, Top, Right, Bottom, All, Box |