المقدمة
هذا الدليل يوضح كيفية قراءة وتحديث حالة المستند على مستوى الوثيقة في Aspose.PDF FOSS للغة C++ — الأجزاء من ملف PDF التي تصف المستند نفسه بدلاً مما يتم رسمه على صفحاته. يركز Aspose.PDF FOSS للغة C++ على الفئة Aspose::Pdf::Document، التي تقوم بتحميل PDF موجود من مسار ملف وتتيح الوصول إليه لكل من تحرير المحتوى وحسابات مستوى المستند. تشمل حسابات مستوى المستند القاموس /Info، تدفق بيانات التعريف XMP، شجرة العلامات (المخطط) المعروضة في لوحة تنقل العارض، الوجهات المسماة المستخدمة في الروابط الداخلية، المرفقات الملفية المدمجة في PDF، وتسلسلات ترقيم الصفحات المخصصة التي يمكن للمستند تعريفها.
تستعرض هذه المشاركة سطح API لكل من هذه المجالات: DocumentInfo للقواميس الكلاسيكية /Info (العنوان، المؤلف، المنشئ، الموضوع، الكلمات المفتاحية)، 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() — كل منها له مُعيّن مطابق، بالإضافة إلى زوج عام 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 — نفس الواجهة المستخدمة في وجهات عناصر المخطط وعملية الروابط. تُزال الإدخالات الموجودة عبر 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() — تصنيف علاقة “الملف المرتبط” في 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. تسمح الرخصة بالاستخدام التجاري، والتعديل، وإعادة التوزيع دون اتفاقية منفصلة.