Σχεδίαση Διανυσματικών Γραφικών σε Σελίδα PDF
Σχεδίαση διανυσματικών γραφικών σε σελίδα PDF
Aspose.PDF FOSS για C++ περιλαμβάνει ένα μικρό σύνολο διανυσματικών γραφικών API για τη σχεδίαση σχημάτων απευθείας σε σελίδα PDF ενώ δημιουργείται ένα έγγραφο. Το σημείο εισόδου είναι το Graph, ένα κοντέινερ τοποθετημένο σε μια σελίδα που κρατά μια συλλογή από αντικείμενα Shape; τρία συγκεκριμένα σχήματα — Circle, Ellipse και Line — κληρονομούν από το Shape και καθένα εκφράζει τη γεωμετρία του διαφορετικά. Το στυλ γραμμής και γεμίσματος ανά σχήμα προέρχεται από το GraphInfo, και το ίδιο το κοντέινερ Graph φέρει ένα BorderInfo για περιθώριο. Αυτό δεν σχετίζεται με την ραστεροποίηση της σελίδας (BmpDevice, JpegDevice, TiffDevice), η οποία μετατρέπει το υπάρχον περιεχόμενο της σελίδας σε μορφές raster εικόνας αντί για σχεδίαση νέας γεωμετρίας.
Το Γραφικό Κοντέινερ και η Προσθήκη Σχημάτων σε μια Σελίδα
Graph τοποθετεί και διαμορφώνει το μέγεθός του στη σελίδα μέσω των Left(), Top(), Width() και Height(), και η σημαία IsChangePosition() ελέγχει αν αυτή η θέση μπορεί να μετατοπιστεί σε σχέση με το υπόλοιπο περιεχόμενο της σελίδας. Τα σχήματα που σχεδιάζει ζουν στο διάνυσμα που επιστρέφει το Shapes() — std::vector<std::unique_ptr<Shape>> — το οποίο γεμίζει με την κατασκευή ενός σχήματος, τη ρύθμισή του και τη μεταφορά του σε αυτό το διάνυσμα. Μόλις δημιουργηθεί, το ίδιο το Graph τοποθετείται στη σελίδα μέσω του Page.Paragraphs().Add(), η ίδια συλλογή που χρησιμοποιείται για άλλο περιεχόμενο επιπέδου σελίδας.
#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");Σχεδίαση Κύκλων και Έλλειψων
Circle και Ellipse εκφράζουν τη γεωμετρία ως απλές αριθμητικές ιδιότητες αντί για κοινό τύπο σημείου ή ορθογωνίου. Το Circle είναι σημείο κέντρου και ακτίνα — PosX(), PosY(), Radius() — ενώ το Ellipse είναι ένα πλαίσιο οριοθέτησης — Left(), Bottom(), Width(), Height(). Και τα δύο κληρονομούν το CheckBounds(containerWidth, containerHeight) από το Shape, το οποίο αναφέρει αν η τρέχουσα γεωμετρία του σχήματος ταιριάζει μέσα σε ένα κοντέινερ του δεδομένου μεγέθους χωρίς να τροποποιεί το ίδιο το σχήμα.
#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);Σχεδίαση Γραμμών με PositionArray
Line αποθηκεύει τη γεωμετρία του διαφορετικά από τα Circle και Ellipse: το PositionArray() επιστρέφει ένα επίπεδο std::vector<float> που περιέχει ένα ζεύγος x, y για κάθε σημείο που διέρχεται η γραμμή, αντί για ένα σταθερό σύνολο ονομασμένων ιδιοτήτων. Δύο σημεία (τέσσερις τιμές) σχεδιάζουν ένα ευθύ τμήμα· επιπλέον ζεύγη σχεδιάζουν ένα πολυστρωματικό μονοπάτι μέσω αυτών των σημείων με τη σειρά. Όπως τα άλλα σχήματα, το Line παρακάμπτει το CheckBounds(containerWidth, containerHeight) από το 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);Στυλιζάρισμα Σχημάτων με GraphInfo και BorderInfo
Κάθε σχήμα διαβάζει και γράφει το στυλ γραμμής και γέμισης του μέσω του Shape.GraphInfo() / GraphInfo(value). Το GraphInfo προεπιλέγει ένα LineWidth() του 1.0f με κενό DashArray(), και επίσης αποκαλύπτει τα Color(), FillColor(), DashArray()/DashPhase() για διακεκομμένες γραμμές, το IsDoubled() για διπλή γραμμή, και τα SkewAngleX()/SkewAngleY(), ScalingRateX()/ScalingRateY(), και RotationAngle() για μετασχηματισμό της γραμμής. Το Graph ίδιο φέρει ένα BorderInfo, ορισμένο μέσω του Border(), το οποίο ομαδοποιεί ένα GraphInfo ανά άκρη — Left(), Right(), Top(), Bottom() — συν ένα RoundedBorderRadius(), και μπορεί να κατασκευαστεί ορίζοντας ποιες άκρες να στιλάρουμε με μια σημαία BorderSide (BorderSide::Left | BorderSide::Right, ή BorderSide::All για κάθε άκρη).
#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);Συμβουλές και Καλές Πρακτικές
- Καλείτε το
CheckBoundsεναντίον του δικού τουWidth()/Height()του ιδιοκτήτηGraph, όχι του πλήρους κουτιού μέσων της σελίδας — η επαλήθευση ελέγχει τη γεωμετρία ενός σχήματος σε σχέση με το μέγεθος του δοχείου που παρέχετε, δεν εξετάζει αυτόματα τη σελίδα. - Προσθέστε σχήματα στο
Shapes()πριν προσθέσετε τοGraphστοPage.Paragraphs()— η δημιουργία ενόςCircle,EllipseήLineδεν έχει ορατό αποτέλεσμα μέχρι να προσαρτηθεί τόσο στο ιδιοκτησιακό τουGraphόσο και τοGraphνα προστεθεί σε μια σελίδα. - Ομαδοποιήστε συναφή σχήματα κάτω από ένα ενιαίο
Graphαντί για έναGraphανά σχήμα· ταLeft()/Top()/Width()/Height()τοποθετούν ολόκληρο το κοντέινερ μία φορά, και κάθε σχήμα στοShapes()σχεδιάζεται σε σχέση με αυτό. - Ορίστε το
Shape.GraphInfo()ρητά για σχήματα που χρειάζονται ορατή γέμιση ή μη προεπιλεγμένη γραμμή — η προεπιλεγμένηGraphInfoέχει πλάτος γραμμής1.0f, χωρίς γέμιση, και κενόDashArray(). - Δομήστε το
Line.PositionArray()ως ζεύγηx0, y0, x1, y1, …με τη σειρά που πρέπει να σχεδιαστεί η διαδρομή — ένα διάνυσμα περιττού μήκους περιγράφει ένα ελλιπές σημείο.
Συνηθισμένα προβλήματα
| Πρόβλημα | Αιτία | Διόρθωση |
|---|---|---|
Ένα Circle, Ellipse ή Line δεν εμφανίζεται ποτέ στη αποθηκευμένη σελίδα | Το σχήμα δημιουργήθηκε αλλά δεν προσαρτήθηκε ποτέ στο Shapes() του Graph, ή το Graph δεν προστέθηκε ποτέ στη σελίδα | Σπρώξτε το σχήμα πάνω στο graph->Shapes() και καλέστε το page.Paragraphs().Add(graph) |
| Το σχήμα σχεδιάζεται με προεπιλεγμένη λεπτή μαύρη γραμμή | Το Shape.GraphInfo() δεν ορίστηκε ποτέ | Καλέστε το shape->GraphInfo(customGraphInfo) πριν προσαρτήσετε το σχήμα στο Shapes() |
Το Line λείπει ή μοιάζει με ένα ενιαίο σημείο | Το PositionArray() έχει λιγότερα από δύο ζεύγη (x, y) ή περιέχει περιττό αριθμό τιμών | Παρέχετε τουλάχιστον τέσσερις τιμές ως x0, y0, x1, y1 |
| Μόνο μερικές άκρες του περιγράμματος του container έχουν μορφοποιηθεί | Το BorderInfo κατασκευάστηκε με μια μάσκα BorderSide που εξαιρεί κάποιες άκρες | Χρησιμοποιήστε το BorderSide::All, ή ενώστε με OR κάθε απαραίτητη σημαία BorderSide |
Το CheckBounds επιστρέφει απροσδόκητα το false | Οι διαστάσεις που περάστηκαν στο CheckBounds δεν ταιριάζουν με το κοντέινερ στο οποίο σχεδιάζεται πραγματικά το σχήμα | Πέρασε το τρέχον Width()/Height() του ιδιοκτήτη Graph |
FAQ
Ποια είναι η διαφορά μεταξύ Circle και AnnotationType::Circle;
Circle (this guide) είναι ένα σχήμα σχεδίασης που σχεδιάζει απευθείας στο περιεχόμενο της σελίδας μέσω ενός Graph. Τα AnnotationType::Circle και CircleAnnotation ανήκουν σε ένα ξεχωριστό σύνολο σχολιασμών API και αντιπροσωπεύουν μια σημείωση σχήματος κύκλου — τα δύο δεν σχετίζονται παρόλο που μοιράζονται το όνομα.
Μπορεί ένα μόνο Graph να περιέχει περισσότερα από ένα σχήμα;
Ναι. Το Graph.Shapes() επιστρέφει το πλήρες std::vector<std::unique_ptr<Shape>> για αυτό το δοχείο, και οποιοσδήποτε συνδυασμός των Circle, Ellipse και Line μπορεί να προσαρτηθεί σε αυτό πριν προστεθεί το Graph στη σελίδα.
Μοιράζονται τα Circle και Ellipse έναν τύπο γεωμετρίας;
Όχι. Circle είναι ένα κεντρικό σημείο και ακτίνα (PosX, PosY, Radius); Ellipse είναι ένα περιοριστικό κουτί (Left, Bottom, Width, Height). Και τα δύο προέρχονται από το Shape, αλλά κανένα από τα δύο δεν μοιράζεται κοινό σημείο ή τύπο ορθογωνίου με το άλλο.
Είναι η σχεδίαση σχημάτων με το Graph το ίδιο με την απόδοση μιας σελίδας σε εικόνα;
Όχι. Graph, Shape, Circle, Ellipse και Line δημιουργούν νέα διανυσματική γεωμετρία στο περιεχόμενο μιας σελίδας κατά τη δημιουργία του εγγράφου. Η μετατροπή μιας υπάρχουσας σελίδας σε ραστερ εικόνα είναι ξεχωριστή δυνατότητα, η οποία διαχειρίζεται από τα BmpDevice, JpegDevice και TiffDevice.
Τι κάνει η μέθοδος GraphInfo.IsDoubled();
Σημειώνει το στίγμα ως διπλή γραμμή αντί να αλλάζει οποιαδήποτε άλλη ιδιότητα του στίγματος. Είναι μια λογική σημαία που διαβάζεται και ορίζεται μέσω του IsDoubled() / IsDoubled(value) μαζί με τις άλλες ιδιότητες στίγματος GraphInfo.
API Reference Περίληψη
| Κλάση/Μέθοδος | Περιγραφή |
|---|---|
Graph | Κοντέινερ σχήματος τοποθετημένο σε μια σελίδα· τοποθετεί τον εαυτό του με Left(), Top(), Width(), Height() |
Graph.Shapes() | Επιστρέφει το std::vector<std::unique_ptr<Shape>> που σχεδιάζεται από αυτό το κοντέινερ |
Graph.GraphInfo() / GraphInfo(value) | Λαμβάνει/ορίζει το στυλ περιγράμμισης και γέμισης του περιέκτη |
Graph.Border() / Border(value) | Λαμβάνει/ορίζει το BorderInfo που πλαισιώνει το περιέκτη |
Shape | Αφηρημένη βάση για Circle, Ellipse και Line; εκθέτει GraphInfo() και CheckBounds() |
Shape.CheckBounds(w, h) | Αναφέρει εάν η γεωμετρία του σχήματος ταιριάζει μέσα σε έναν περιέκτη με το δοσμένο πλάτος/ύψος |
Circle | Σχήμα κύκλου: PosX(), PosY(), Radius() |
Ellipse | Σχήμα έλλειψης: περιοριστικό πλαίσιο μέσω Left(), Bottom(), Width(), Height() |
Line | Σχήμα γραμμής/διαδρομής: PositionArray(), μια επίπεδη std::vector<float> των συντεταγμένων x, y |
GraphInfo | Στυλ περιγράμματος/γέμισης: LineWidth(), Color(), FillColor(), DashArray(), DashPhase(), IsDoubled(), RotationAngle(), SkewAngleX()/SkewAngleY(), ScalingRateX()/ScalingRateY() |
BorderInfo | Περιγράμμα περιέκτη ανά άκρη: Left(), Right(), Top(), Bottom() (κάθε ένα GraphInfo), συν RoundedBorderRadius() |
BorderSide | Απαρίθμηση επιλογής άκρων κατά τη δημιουργία ενός BorderInfo: None, Left, Top, Right, Bottom, All, Box |