הקדמה
מדריך זה מראה כיצד לקרוא ולעדכן מצב ברמת המסמך ב-Aspose.PDF FOSS עבור C++ — החלקים של קובץ PDF המתארים את המסמך עצמו ולא מה שמוצג בדפים שלו. Aspose.PDF FOSS עבור C++ מתמקדת במחלקה Aspose::Pdf::Document, הטוענת קובץ PDF קיים מנתיב קובץ ומחשפת אותו הן לעריכת תוכן והן לניהול ברמת המסמך. ניהול ברמת המסמך כולל את מילון /Info, זרם המטא-נתונים XMP, עץ הסימניות (מתווה) המופיע בפאנל הניווט של מציג, יעדים בשם המשמשים לקישורים פנימיים, קבצים מצורפים משובצים ב-PDF, והקבוצות המותאמות של מספור עמודים שהמסמך יכול להגדיר.
הפוסט הזה מוביל דרך ממשק API עבור כל אחד מהתחומים האלה: DocumentInfo עבור שדות מילון הקלאסי /Info (title, author, creator, subject, keywords), Metadata עבור זרם המטא-נתונים XMP, Outlines ו-OutlineItemCollection עבור עץ הסימניות, NamedDestinationCollection עבור קישורים בשם, EmbeddedFileCollection ו-FileSpecification עבור קבצים מצורפים, ו-PageLabelCollection עבור מספור עמודים לפי טווחים. כל סעיף משייך את המחלקה הרלוונטית לדוגמה עובדת שנבנתה מתוך אובייקט Document שטען.
Aspose.PDF FOSS עבור C++ משוחררת תחת רישיון MIT ומקושרת רק לספרייה הסטנדרטית של C++, ולכן כל פעולה המתוארת כאן פועלת ללא מנוע PDF קנייני או תלות צד שלישי. הספרייה נבנית כיעד סטטי (aspose_pdf_foss) שנוסף באמצעות CMake.
מה נכלל
המילון /Info — DocumentInfo
Document.Info() מחזירה הפנייה DocumentInfo הקשורה למילון /Info של ה-PDF. הוא מספק גישות טיפוסיות לשדות הסטנדרטיים — Title(), Author(), Creator(), Subject(), Keywords(), Producer(), ו-Trapped() — שלכל אחד מהם יש setter תואם, וכן זוג גנרי Add(key, value) / Remove(key) למפתחות מותאמים אישית ו-IsPredefinedKey(key) לבדיקת האם שם המפתח הוא אחד מהשדות הסטנדרטיים. Document.SetTitle() היא קיצור שמכתוב את הכותרת ישירות למסמך.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/document_info.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& info = doc.Info();
std::cout << "Title: " << info.Title() << "\n";
std::cout << "Author: " << info.Author() << "\n";
info.Author("Demo author");
info.Creator("Aspose.PDF FOSS C++");
info.Add("Generated-By", "document-management sample");
doc.Save("output.pdf");
}
מטא-נתוני XMP — Metadata
מעבר למילון /Info, Document.Metadata() מחזירה אובייקט Metadata על פני זרם המטא-נתונים XMP של המסמך. הוא מתנהג כקונטיינר אסוציאטיבי של ערכים: Add(key, value), Contains(key), ContainsKey(key), TryGetValue(key, value), Remove(key), Keys(), Values(), ו-Count(). מרחבי שם מותאמים נרשמים באמצעות RegisterNamespaceUri(prefix, namespaceUri) ונפתרים הלוך ושוב עם GetNamespaceUriByPrefix() ו-GetPrefixByNamespaceUri().
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/metadata.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& metadata = doc.Metadata();
metadata.RegisterNamespaceUri("myapp", "http://example.com/myapp/1.0/");
metadata.Add("myapp:BatchId", "2026-07-run-42");
std::cout << "XMP entries: " << metadata.Count() << "\n";
doc.Save("output.pdf");
}
סימניות וקווי מתאר
Document.Outlines() מחזיר את OutlineCollection של המסמך — שורש עץ הסימניות שמוצג בלוח הניווט של הצופה. האוסף תומך ב-Count(), Add(item), Clear(), Contains(item), Remove(item), Delete(), ובמחוללי הקצה First() / Last(), שמחזירים צמתים מסוג OutlineItemCollection. כל צומת OutlineItemCollection נושא Title(), דגלי תצוגה Bold() / Italic(), מצב הרחבה Open(), Destination() או Action(), וחברי ניווט Next(), Prev(), HasNext(), Level(), ו-Parent() חזרה לאוסף Outlines הבעלים.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/outlines.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& outlines = doc.Outlines();
std::cout << "Top-level bookmarks: " << outlines.Count() << "\n";
if (outlines.Count() > 0) {
auto& first = outlines.First();
std::cout << "First bookmark: " << first.Title()
<< " (level " << first.Level() << ")\n";
}
}
יעדים בשם
Document.NamedDestinations() מחזיר NamedDestinationCollection, טבלת חיפוש שממפה שמות שמוגדרים על-ידי היישום ליעדים בתוך המסמך. ערכים חדשים נרשמים בעזרת Add(name, appointment), כאשר appointment הוא מימוש של IAppointment — אותה ממשק המשמש גם ליעדי פריטי קוֹטֶבּר (outline-item) ולפעולות קישורים. ערכים קיימים מוסרים בעזרת Remove(name), נספרים עם Count(), ונרשמים עם Names().
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/named_destination_collection.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& destinations = doc.NamedDestinations();
std::cout << "Named destinations: " << destinations.Count() << "\n";
for (const auto& name : destinations.Names()) {
std::cout << " " << name << "\n";
}
}
קבצים משובצים וקבצים מצורפים
Document.EmbeddedFiles() מחזיר EmbeddedFileCollection של קבצי FileSpecification המצורפים בתוך ה-PDF. קבצים מתווספים בעזרת Add(file) או Add(key, file), נאתרים באמצעות FindByName(name), מוסרים עם Delete(name), DeleteByKey(key), או Delete(), ונרשמים דרך Count() ו-Keys(). כל FileSpecification מדווח על Name(), Description(), MIMEType(), ו-AFRelationship() — סיווג הקשר “Associated File” של ה-PDF.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/file_specification.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& files = doc.EmbeddedFiles();
std::cout << "Embedded files: " << files.Count() << "\n";
for (const auto& key : files.Keys()) {
auto spec = files.FindByName(key);
std::cout << " " << spec.Name() << " (" << spec.MIMEType() << ")\n";
}
}
תוויות עמוד
Document.PageLabels() מחזיר PageLabelCollection עבור רצפי המספור המותאמים שהצופה מציג במקום מספרי העמודים הפיזיים — לדוגמה, ספרות רומיות לפתיחה ולאחר מכן ספרות ערבית לגוף. GetLabel(pageIndex) מחזיר את PageLabel הפועל עבור העמוד; PageLabel מציג StartingValue(), NumberingStyle() (ערך Aspose::Pdf::NumberingStyle כגון NumeralsArabic או NumeralsRomanLowercase), ו-Prefix(). UpdateLabel(pageIndex, pageLabel) משייך תווית החל מהעמוד הזה, RemoveLabel(pageIndex) מוחקת אחת, ו-GetPages() מציגה את כל אינדקסי העמודים שנושאים תווית מותאמת.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/page_label.hpp>
#include <aspose/pdf/page_label_collection.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& labels = doc.PageLabels();
for (int pageIndex : labels.GetPages()) {
auto label = labels.GetLabel(pageIndex);
std::cout << "Page " << pageIndex << " prefix: " << label.Prefix()
<< ", starts at " << label.StartingValue() << "\n";
}
auto preface = labels.GetLabel(1);
preface.NumberingStyle(Aspose::Pdf::NumberingStyle::NumeralsRomanLowercase);
preface.StartingValue(1);
labels.UpdateLabel(1, preface);
doc.Save("output.pdf");
}
התחלה מהירה
הוסף את הספרייה כתת-ספרייה של CMake וקשר אל יעד aspose_pdf_foss:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)
פתח מסמך, קרא ועדכן את נתוני המטה-מידע /Info, ושמור את התוצאה:
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& info = doc.Info();
std::cout << "Title: " << info.Title() << "\n";
std::cout << "Author: " << info.Author() << "\n";
doc.SetTitle("Updated Report Title");
info.Author("Report Generator");
info.Add("Generated-By", "Aspose.PDF FOSS for C++");
doc.Save("output.pdf");
return 0;
}
פורמטים נתמכים
| פורמט | הרחבה | קריאה | כתיבה |
|---|---|---|---|
| BMP | .bmp | — | ✓ |
| JPEG | .jpg | — | ✓ |
| TIFF | .tiff | — | ✓ |
| Text | .txt | — | ✓ |
| SVG | .svg | ✓ | — |
BMP, JPEG, ו-TIFF הם פלטי רינדור דפים שמיוצרים על-ידי מחלקות המכשיר המתאימות, וטקסט נשלף באמצעות TextAbsorber. SVG מיובא כתוכן וקטורי דרך נתיב הטעינה של הספרייה ל-SVG. אף אחד מסוגי ניהול המסמכים שהוזכרו למעלה אינו ממיר פורמט — הם רק קוראים וכותבים מבנה PDF.
קוד פתוח ורישוי
Aspose.PDF FOSS עבור C++ מופץ תחת רישיון MIT, עם הקוד המלא זמין ב-github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp. הרישיון מאפשר שימוש מסחרי, שינוי והפצה מחדש ללא צורך בהסכם נפרד.