איך לעבוד עם גרפיקה של PDF ב-C++
Aspose.PDF FOSS עבור C++ כולל API גרפיקה וקטורית קטנה לציור צורות חופשיות ישירות על דף PDF — נפרד ממכשירי הרינדור הרסטריים של הספרייה (BmpDevice, JpegDevice, TiffDevice), שממירים תוכן דף קיים לתמונות. מדריך זה מוביל ביצירת מכולת Graph, הוספת צורות Circle, Ellipse ו-Line, עיצוב הצורות עם GraphInfo, והצבת ה-Graph המוגמר על דף. הספרייה מתווספת לפרויקט דרך CMake.
מדריך שלב-אחר-שלב
שלב 1: התקנת החבילה
הוסף את הספרייה כתת-ספרייה של CMake וקשר נגד יעד aspose_pdf_foss:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)אמת שהכלי וראשי הקבצים נפתרים על-ידי הידור תוכנית מינימלית:
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc;
std::cout << "Linked OK — pages: " << doc.Pages().Count() << "\n";
}בנייה מוצלחת שמדפיסה pages: 0 מאשרת שהספרייה מקושרת כראוי.
שלב 2: ייבא מחלקות נדרשות
כלול את הכותרות עבור המסמך, מיכל הצורה, שלוש הצורות הקונקרטיות, וסוגי העיצוב שלהן:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/drawing/graph.hpp>
#include <aspose/pdf/drawing/circle.hpp>
#include <aspose/pdf/drawing/ellipse.hpp>
#include <aspose/pdf/drawing/line.hpp>
#include <aspose/pdf/graph_info.hpp>
#include <aspose/pdf/border_info.hpp>
#include <aspose/pdf/color.hpp>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Drawing;Graph, Shape, Circle, Ellipse, ו-Line נמצאים במרחב השמות Aspose::Pdf::Drawing; GraphInfo, BorderInfo, ו-Color נמצאים ישירות תחת Aspose::Pdf.
שלב 3: צור גרף והוסף אותו לעמוד
Graph הוא מכולה שממקמת את עצמה בעמוד באמצעות Left(), Top(), Width() ו-Height(), ומחזיקה את הצורות שנציירות בתוכה באמצעות Shapes(). לאחר שהוגדר, היא ממוקמת בעמוד באמצעות Page.Paragraphs().Add(), אותה אוסף המשמש לתוכן עמודים אחרים:
Document doc;
Page page = doc.Pages().Add();
auto graph = std::make_shared<Graph>();
graph->Left(50.0);
graph->Top(50.0);
graph->Width(400.0);
graph->Height(400.0);
page.Paragraphs().Add(graph);שלב 4: צייר מעגל ואליפסה
Circle מתאר את הגיאומטריה שלו באמצעות PosX(), PosY() ו-Radius(). Ellipse משתמש בתיבת גבול במקום זאת — Left(), Bottom(), Width() ו-Height(). שניהם מתווספים ל-Graph על-ידי הוספתם, כמצביעים Shape, לווקטור שמוחזר על-ידי Shapes():
auto circle = std::make_unique<Circle>();
circle->PosX(150.0);
circle->PosY(150.0);
circle->Radius(75.0);
graph->Shapes().push_back(std::move(circle));
auto ellipse = std::make_unique<Ellipse>();
ellipse->Left(20.0);
ellipse->Bottom(20.0);
ellipse->Width(120.0);
ellipse->Height(60.0);
graph->Shapes().push_back(std::move(ellipse));שתי הצורות יורשות CheckBounds(containerWidth, containerHeight) מ-Shape, אשר מדווחת האם הגיאומטריה הנוכחית של הצורה מתאימה לתוך מכולה בגודל הנתון:
bool circleFits = circle->CheckBounds(graph->Width(), graph->Height());שלב 5: צייר קו
Line מאחסן את הגיאומטריה שלו בצורה שונה: PositionArray() מחזיק std::vector<float> שטוח של קואורדינטות — זוג x, y לכל נקודה — במקום תכונות בשם. קטע של שני נקודות דורש ארבע ערכים: x התחלה, y התחלה, x סוף, y סוף.
auto line = std::make_unique<Line>();
line->PositionArray({0.0f, 0.0f, 400.0f, 400.0f});
graph->Shapes().push_back(std::move(line));שלב 6: עיצוב צורות עם GraphInfo וגבול המכולה
קו המתאר והמילוי של כל צורה מגיעים מ-GraphInfo, נקראים ומוגדרים דרך Shape.GraphInfo() / GraphInfo(value). הוא חושף את רוחב הקו (LineWidth(), ברירת מחדל 1.0f), צבע הקו והמילוי (Color(), FillColor()), ותבנית הקו המקווקו (DashArray(), DashPhase()):
GraphInfo stroke;
stroke.LineWidth(2.0f);
stroke.Color(Color::FromRgb(1.0, 0.0, 0.0));
stroke.FillColor(Color::FromRgb(1.0, 0.9, 0.9));המכולה Graph עצמה נושאת BorderInfo, המוגדר דרך Border(), אשר מקבץ GraphInfo אחד לכל קצה (Left(), Right(), Top(), Bottom()) ועוד RoundedBorderRadius() למסגרת של המכולה עצמה:
BorderInfo border{BorderSide::All, 1.5f, Color::Black()};
border.RoundedBorderRadius(6.0);
graph->Border(border);שלב 7: שמור את המסמך
doc.Save("graphics.pdf");בעיות נפוצות ופתרונות
צורה שיצרתי לעולם לא מופיעה בעמוד
יצירת Circle, Ellipse או Line באופן עצמאי אינה משפיעה עד שהיא מצורפת לווקטור שמוחזר על ידי ה-Graph הבעלים של Shapes(), וה-Graph נוסף לעמוד דרך Page.Paragraphs().Add(). כל שלושת השלבים — יצירה, צירוף, הוספת ה-Graph לעמוד — נדרשים.
הצורות מוצגות במיקום הלא נכון
Graph.Left() ו-Graph.Top() ממקמים את המכולה בעמוד; תכונות הצורה (Circle.PosX()/PosY(), Ellipse.Left()/Bottom(), קואורדינטות Line.PositionArray()) מתארות גאומטריה בתוך המכולה הזו. יש לבדוק גם את מיקום המכולה וגם את הקואורדינטות של הצורה עצמה כאשר הפלט נראה מוזז.
CheckBounds returns false unexpectedly
CheckBounds(containerWidth, containerHeight) בודק את הגאומטריה של הצורה עצמה מול הממדים שהועברו — בדרך כלל Width()/Height() של ה-Graph הבעלים, ולא את תיבת המדיה המלאה של העמוד. העברת ממדים שגויים גורמת לתוצאה שלילית שגויה אפילו כאשר הצורה בתורה תתאים בתוך ה-Graph.
א Line אינו מופיע, או שמופיע כנקודה אחת
PositionArray() זקוק לפחות לשני זוגות (x, y) — ארבע ערכי float — כדי לתאר מקטע נראה. וקטור קצר יותר אינו יוצר קו.
Confusing Circle with AnnotationType::Circle or CircleAnnotation
הספרייה כוללת גם API נפרדות של סימוני PDF, שבהן AnnotationType::Circle ו-CircleAnnotation מייצגות סימוני סימון בצורת עיגול. המחלקה Circle המתוארת במדריך זה אינה קשורה — היא נמצאת ב-Aspose::Pdf::Drawing ומציירת ישירות לתוכן העמוד במקום להוסיף אובייקט סימון.
שאלות נפוצות
מה ההבדל בין GraphInfo ל-BorderInfo?
GraphInfo מעצב קו יחיד — רוחב הקו, צבע, צבע מילוי, ודפוס מקווקו — ומשמש הן על צורות בודדות (דרך Shape.GraphInfo()) והן על קצה בתוך BorderInfo. BorderInfo מקבץ ארבע ערכי GraphInfo (Left(), Right(), Top(), Bottom()) ועוד RoundedBorderRadius() כדי לתאר את מסגרת הגבול של מכולת Graph.
האם אוכל למלא צורה בצבע אחיד?
כן. GraphInfo.FillColor() מגדיר את צבע המילוי המשמש כאשר הצורה מצוירת דרך Graph שבבעלותו.
האם Circle שומרת תיבת גבול כמו Ellipse?
לא. Circle חושף את PosX(), PosY() ו-Radius(); Ellipse חושף את Left(), Bottom(), Width() ו-Height(). הם אינם חולקים ייצוג גאומטרי משותף מעבר לבסיס האבסטרקטי Shape ועיצוב GraphInfo.
האם גרף אחד יכול להכיל יותר מצורה אחת?
כן. Graph.Shapes() מחזיר את האוסף המלא של אובייקטי Shape הממוקמים בתוך ה-Graph הזה — ניתן לצרף מעגלים, אליפסות וקווים לאותו מכולה.
האם זה זהה לרינדור דף לתמונה?
לא. BmpDevice, JpegDevice ו-TiffDevice ממירים לתמונת רסטר את תוכן הדף הקיים לפורמטים של תמונות. Graph, Shape, Circle, Ellipse ו-Line בונים גאומטריה וקטורית חדשה ישירות בתוכן ה-PDF בזמן שהמסמך נבנה או נערך.