مقدمة
Aspose.PDF FOSS لـ C++ هي مكتبة مفتوحة المصدر C++20 للعمل مع مستندات PDF. يغطي سطح API إدارة المستندات والصفحات، استخراج النص، التصيير النقطي، التشفير، التعليقات التوضيحية، وحقول AcroForm التفاعلية — العمليات الأكثر شيوعًا عندما تحتاج تطبيق C++ إلى إنشاء، فحص، أو تحويل ملفات PDF دون الاعتماد على محرك PDF خارجي أو SDK تجاري.
ترتبط المكتبة لا شيء سوى مكتبة C++ القياسية. تم تنفيذ المكونات الداخلية مثل مشفرات BMP و JPEG و TIFF النقطية ومُصوّر الصفحة من الصفر داخل المشروع، لذلك لا توجد أي اعتماد على مُصوّر PDF نظامي، أو مكون PDF تجاري، أو أي مشفر صور طرف ثالث. هذا يحافظ على بصمة الاعتماد عند الصفر بخلاف مُترجم متوافق مع C++20 ومكتبة قياسية.
Aspose.PDF FOSS لـ C++ صُدرت تحت رخصة MIT. يستعرض هذا المقال المجالات الرئيسية للميزات التي تكشفها فئة Document وأنواعها الداعمة، يليه مثال بدء سريع ودعم الصيغ المؤكد حاليًا.
الميزات الرئيسية
إدارة المستندات والصفحات
فئة Document هي نقطة الدخول لفتح، فحص، وحفظ ملفات PDF. يتم الوصول إلى الصفحات عبر Document.Pages()، التي تُعيد PageCollection تدعم Count()، Add()، Insert(pageNumber)، وDelete(pageNumber). يتم قراءة وتحديث البيانات الوصفية على مستوى المستند عبر Document.Info() (مثيل DocumentInfo) أو تُضبط مباشرةً باستخدام Document.SetTitle().
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/page_collection.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Page count: " << doc.Pages().Count() << "\n";
// Insert a blank page after page 1, then drop the last page
doc.Pages().Insert(2);
doc.Pages().Delete(doc.Pages().Count());
doc.SetTitle("Generated Report");
doc.Save("output.pdf");
}
Document.Optimize() و Document.OptimizeResources() يقللان من حجم ملف الإخراج عن طريق دمج وحذف الموارد غير المستخدمة قبل الحفظ.
استخراج النص
Aspose::Pdf::Text::TextAbsorber تستخرج المحتوى النصي العادي لمستند كامل أو صفحة واحدة. Visit() تتجول عبر الهدف و Text() تُعيد السلسلة المتراكمة. TextFragmentAbsorber تعمل بدقة أعلى، وتكشف عن تشغيلات النص الفردية عبر TextFragmentCollection.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/text_fragment_absorber.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
// Extract all text from the document
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(doc);
std::cout << absorber.Text() << "\n";
// Extract text fragments from page 1
Aspose::Pdf::Text::TextFragmentAbsorber fragmentAbsorber;
fragmentAbsorber.Visit(doc.Pages()[1]);
auto fragments = fragmentAbsorber.TextFragments();
std::cout << "Fragments on page 1: " << fragments.Count() << "\n";
}
التصيير إلى صور نقطية
تُصَيّر الصفحات إلى تنسيقات نقطية عبر فئات الأجهزة الخاصة بكل تنسيق — PngDevice، JpegDevice، BmpDevice، وTiffDevice — كل منها يطبق Process(page, output). يتم التحكم في دقة الإخراج باستخدام فئة Resolution.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/png_device.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto page = doc.Pages()[1];
Aspose::Pdf::Devices::PngDevice png(Aspose::Pdf::Devices::Resolution(150));
std::ofstream pngOut("page1.png", std::ios::binary);
png.Process(page, pngOut);
Aspose::Pdf::Devices::BmpDevice bmp(Aspose::Pdf::Devices::Resolution(150));
std::ofstream bmpOut("page1.bmp", std::ios::binary);
bmp.Process(page, bmpOut);
}
JpegDevice يتبع نفس نمط Process(page, output) لإخراج JPEG. TiffDevice يدعم أيضًا إخراجًا متعدد الصفحات في استدعاء واحد عبر Process(document, fromPage, toPage, output)، ويكشف عن RenderingOptions() للتحكم في كيفية تصيير حقول النموذج إلى الإخراج النقطي.
التشفير وأذونات الوصول
Document.Encrypt() يحمي مستندًا بكلمة مرور للمستخدم والمالك، مع اختيار الشيفرة عبر تعداد CryptoAlgorithm: RC4x40، RC4x128، AESx128، أو AESx256. تُوصف الأذونات الممنوحة باستخدام النوع Permissions، الذي تشمل قيم العلامات الخاصة به PrintDocument، ModifyContent، ExtractContent، ModifyTextAnnotations، FillForm، ExtractContentWithDisabilities، AssembleDocument، وPrintingQuality.
#include <aspose/pdf/document.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
doc.Encrypt("user-password", "owner-password",
Aspose::Pdf::Permissions(),
Aspose::Pdf::CryptoAlgorithm::AESx256);
doc.Save("encrypted.pdf");
}
يتم فك تشفير مستند مشفر مفتوح بالفعل في مكانه باستخدام Document.Decrypt(). Document.IsEncrypted() يُبلغ عما إذا كان المستند المحمّل يحمل حاليًا قاموس تشفير.
التعليقات التوضيحية
التعليقات التوضيحية على مستوى الصفحة — ملاحظات نصية، أشكال، وتعليمات — يمكن الوصول إليها عبر Page.Annotations()، الذي يُعيد AnnotationCollection. تُظهر الإدخالات الفردية خصائص مشتركة مثل Contents()، Rect()، Color()، Border()، وAnnotationType()، ويمكن إزالتها من الصفحة أو دمجها في محتوى ثابت.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& annotations = doc.Pages()[1].Annotations();
std::cout << "Annotation count: " << annotations.Count() << "\n";
for (int i = 0; i < static_cast<int>(annotations.Count()); ++i) {
std::cout << "Contents: " << annotations[i].Contents() << "\n";
}
// Remove the first annotation on the page
if (annotations.Count() > 0) {
annotations.Delete(annotations[0]);
}
doc.Save("output.pdf");
}
يمكن أيضًا تحويل أي Annotation واحد مباشرةً إلى محتوى صفحة ثابت باستخدام طريقة Flatten() الخاصة به، بشكل مستقل عن سير عمل دمج النماذج الموضح أدناه.
نماذج تفاعلية
يتم إدارة حقول AcroForm في المستند عبر Document.Form()، الذي يُعيد مثيل Form يدعم Count()، HasField(fieldName)، Delete(fieldName)، وFlatten(). تُرفق الحقول الجديدة باستخدام Form.Add(field, pageNumber)، حيث أن field هو نوع فرعي محدد من Field مثل TextBoxField، CheckboxField، ChoiceField، أو ButtonField.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& form = doc.Form();
std::cout << "Form fields: " << form.Count() << "\n";
if (form.HasField("Signature1")) {
form.Delete("Signature1");
}
// Convert every remaining field into static page content
form.Flatten();
doc.Save("flattened.pdf");
}
البدء السريع
أضف المكتبة كدليل فرعي في CMake واربطها بالهدف aspose_pdf_foss:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)
افتح مستندًا، استخرج نصه، وحوّل الصفحة الأولى إلى PNG:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/png_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Pages: " << doc.Pages().Count() << "\n";
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(doc);
std::cout << absorber.Text() << "\n";
Aspose::Pdf::Devices::PngDevice png(Aspose::Pdf::Devices::Resolution(150));
std::ofstream out("page1.png", std::ios::binary);
png.Process(doc.Pages()[1], out);
}
الصيغ المدعومة
| تنسيق | امتداد | قراءة | كتابة |
|---|---|---|---|
| BMP | bmp | — | ✓ |
| JPEG | jpeg | — | ✓ |
| TIFF | tiff | — | ✓ |
| Text | txt | — | ✓ |
| SVG | svg | ✓ | — |
المصدر المفتوح والترخيص
Aspose.PDF FOSS للغة C++ مُصدرة تحت ترخيص MIT، مما يسمح بالاستخدام التجاري، والتعديل، وإعادة التوزيع دون رسوم ملكية. الشيفرة المصدرية متوفرة على github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp.
يُسمح بالاستخدام التجاري وفقًا لشروط ترخيص MIT. إذا كان مشروعك يتطلب دعمًا من المستوى المؤسسي، تغطية صيغ موسعة، أو تكامل سحابي، فإن Aspose.PDF — Enterprise Product Family هو عرض تجاري منفصل.