PDF पेज पर वेक्टर ग्राफ़िक्स बनाना

PDF पेज पर वेक्टर ग्राफ़िक्स बनाना

PDF पेज पर वेक्टर ग्राफ़िक्स बनाना

Aspose.PDF FOSS for C++ में एक छोटा वेक्टर-ग्राफ़िक्स API शामिल है जो दस्तावेज़ बनते समय सीधे PDF पेज पर आकार ड्रॉ करने के लिए उपयोग किया जाता है। प्रवेश बिंदु है Graph, एक कंटेनर जो पेज पर रखा जाता है और Shape ऑब्जेक्ट्स का संग्रह रखता है; तीन ठोस आकार — Circle, Ellipse, और Line — Shape से व्युत्पन्न होते हैं और प्रत्येक अपनी ज्यामिति को अलग तरीके से व्यक्त करते हैं। प्रत्येक आकार की स्ट्रोक और फ़िल स्टाइलिंग GraphInfo से आती है, और Graph कंटेनर स्वयं फ्रेमिंग के लिए एक BorderInfo ले जाता है। यह पेज रेस्टराइज़ेशन (BmpDevice, JpegDevice, TiffDevice) से असंबंधित है, जो मौजूदा पेज सामग्री को रास्टर इमेज फ़ॉर्मैट में बदलता है न कि नई ज्यामिति बनाता है।


ग्राफ़ कंटेनर और पेज पर आकार जोड़ना

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()। दोनों Shape से CheckBounds(containerWidth, containerHeight) विरासत में प्राप्त करते हैं, जो रिपोर्ट करता है कि क्या आकार की वर्तमान ज्यामिति दिए गए आकार के कंटेनर के भीतर फिट बैठती है बिना स्वयं आकार को बदले।

#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 Shape से CheckBounds(containerWidth, containerHeight) को ओवरराइड करता है।

#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 को मालिक Graph के अपने Width()/Height() के विरुद्ध कॉल करें, न कि पेज के पूर्ण मीडिया बॉक्स के — यह जांच आकृति की ज्यामिति को उस कंटेनर आकार के खिलाफ मान्य करती है जिसे आप पास करते हैं, यह स्वचालित रूप से पेज को नहीं देखती।
  • आकृतियों को 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 सहेजे गए पृष्ठ पर कभी नहीं दिखाई देता हैआकार बनाया गया था लेकिन कभी भी उसके Graph के Shapes() में जोड़ा नहीं गया, या Graph को पृष्ठ में कभी जोड़ा नहीं गयाआकार को graph->Shapes() पर पुश करें और page.Paragraphs().Add(graph) को कॉल करें
आकार डिफ़ॉल्ट पतली काली स्ट्रोक के साथ बनता हैShape.GraphInfo() कभी सेट नहीं किया गयाshape->GraphInfo(customGraphInfo) को कॉल करें, Shapes() में आकार जोड़ने से पहले
Line अनुपलब्ध है या यह एक बिंदु जैसा दिखता हैPositionArray() में दो (x, y) जोड़ों से कम हैं, या मानों की संख्या विषम हैकम से कम चार मान x0, y0, x1, y1 के रूप में प्रदान करें
केवल कंटेनर बॉर्डर के कुछ किनारे स्टाइल किए गए हैंBorderInfo को एक BorderSide मास्क के साथ बनाया गया था जो कुछ किनारों को बाहर रखता हैउपयोग करें BorderSide::All, या सभी आवश्यक BorderSide फ़्लैग को OR करके मिलाएँ
CheckBounds अप्रत्याशित रूप से false वापस देता हैCheckBounds को पास किए गए आयाम उस कंटेनर से मेल नहीं खाते जिसमें आकृति वास्तव में खींची गई हैस्वामित्व वाले Graph का वर्तमान Width()/Height() पास करें

FAQ

Circle और AnnotationType::Circle में क्या अंतर है?

Circle (यह मार्गदर्शिका) एक ड्रॉइंग आकार है जो Graph के माध्यम से सीधे पृष्ठ सामग्री में ड्रॉ करता है। AnnotationType::Circle और CircleAnnotation एक अलग एनोटेशन API से संबंधित हैं और इसके बजाय एक वृत्त-आकार की मार्कअप एनोटेशन का प्रतिनिधित्व करते हैं — दोनों साझा नाम के बावजूद असंबंधित हैं।

क्या एकल ग्राफ़ में एक से अधिक आकार हो सकते हैं?

हां। 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 सारांश

Class/Methodविवरण
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(), x, y निर्देशांक का एक सपाट std::vector<float>
GraphInfoस्ट्रोक/फ़िल शैली: LineWidth(), Color(), FillColor(), DashArray(), DashPhase(), IsDoubled(), RotationAngle(), SkewAngleX()/SkewAngleY(), ScalingRateX()/ScalingRateY()
BorderInfoप्रति-किनारा कंटेनर बॉर्डर: Left(), Right(), Top(), Bottom() (प्रत्येक एक GraphInfo), साथ में RoundedBorderRadius()
BorderSideएक BorderInfo बनाते समय किनारों का चयन करने वाला Enum: None, Left, Top, Right, Bottom, All, Box

यह भी देखें

 हिन्दी