ציור גרפיקה וקטורית בדף 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(). שניהם יורשים 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 אף פעם לא מופיעים בדף השמורהצורה נבנתה אך מעולם לא צורפה ל-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, או ערוך OR לכל דגל BorderSide הנדרש
CheckBounds מחזיר באופן בלתי צפוי falseהממדים שנשלחו ל-CheckBounds אינם תואמים למכל שבו הצורה מצוירת בפועלהעבר את Width()/Height() הנוכחי של Graph הבעלים

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 סיכום

מחלקה/מתודהתיאור
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()
BorderSideEnum לבחירת קצוות בעת בניית BorderInfo: None, Left, Top, Right, Bottom, All, Box

ראה גם

 עברית