ציור גרפיקה וקטורית בדף 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() |
BorderSide | Enum לבחירת קצוות בעת בניית BorderInfo: None, Left, Top, Right, Bottom, All, Box |