مقدمة
Aspose.PDF FOSS للـ C++ هي مكتبة مفتوحة المصدر جديدة للعمل مع مستندات PDF من شفرة C++20. تم إصدارها تحت رخصة MIT ولا تحمل أي اعتماد وقت تشغيل بخلاف مكتبة C++ القياسية — يتم تنفيذ مشفّرات BMP و JPEG و TIFF، ومُرصّص الصفحة، ومُحلل PDF داخليًا، لذا لا يوجد ربط بمحرك PDF تجاري، أو برنامج ترميز صور خارجي، أو مكتبة تشفير من طرف ثالث.
المكتبة مُنظمة حول الفئة Aspose::Pdf::Document، التي تقوم بتحميل PDF من مسار ملف وتكشف محتوياته عبر Document.Pages()، وهو PageCollection من كائنات Page الفردية. من هناك، يغطي API استخراج النص، تحويل الصفحات إلى رستر، تشفير المستند، التعليقات التوضيحية، وحقول AcroForm — العمليات اللازمة لقراءة، فحص، وتعديل ملفات PDF الموجودة، أو تجميع ملفات جديدة من الصفر.
هذا الإصدار موجه للمطورين الذين يحتاجون إلى معالجة PDF داخل قاعدة شفرة C++ دون إضافة رخصة تجارية أو سلسلة تبعيات من طرف ثالث: خطوط أنابيب المستندات، خدمات استخراج المحتوى، أدوات تحويل PDF إلى صورة، والتطبيقات التي تحتاج إلى تشفير أو قراءة بيانات النماذج كجزء من بناء أكبر.
ما الذي يتضمنه
تحميل المستند والوصول إلى الصفحات
فتح PDF موجود يتم عبر استدعاء مُنشئ واحد. تقوم Document بتحليل الملف وتكشف صفحاته عبر Pages()، التي تُعيد PageCollection تدعم الفهرسة بدءاً من 1، Count()، وAdd()/Insert()/Delete() لإعادة هيكلة ترتيب الصفحات.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Page count: " << doc.Pages().Count() << "\n";
auto page = doc.Pages()[1];
std::cout << "First page number: " << page.Number() << "\n";
}
استخراج النص
Aspose::Pdf::Text::TextAbsorber يتجول في Document أو في Page فردية ويجمع محتوى النص الذي يجدها. استدعِ Visit() مع مستند أو صفحة، ثم اقرأ النتيجة باستخدام Text(). تُبلغ HasErrors() عما إذا كان الماصّ قد صادف محتوى لم يتمكن من معالجته.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(doc);
std::cout << absorber.Text() << "\n";
if (absorber.HasErrors()) {
std::cerr << "Some content could not be extracted\n";
}
}
تحويل إلى صور نقطية
الصفحات تُرسم إلى BMP أو JPEG أو TIFF عبر الفئات BmpDevice وJpegDevice وTiffDevice. كل جهاز يُنشأ بـ Resolution ويكشف عن طريقة Process(page, output) التي تكتب الصورة المرسومة إلى تدفق إخراج.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
Aspose::Pdf::Devices::BmpDevice bmp(Aspose::Pdf::Devices::Resolution(150));
std::ofstream out("page1.bmp", std::ios::binary);
bmp.Process(doc.Pages()[1], out);
}
التشفير
Document.Encrypt() يحمي مستندًا بكلمة مرور للمستخدم، كلمة مرور للمالك، قيمة صلاحية، واختيار CryptoAlgorithm. يغطي التعداد RC4-40 (RC4x40)، RC4-128 (RC4x128)، AES-128 (AESx128)، وAES-256 (AESx256). Document.Decrypt() يعكس العملية، وIsEncrypted() تُبلغ عما إذا كان المستند مشفرًا حاليًا.
#include <aspose/pdf/document.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
doc.Encrypt("user-password", "owner-password",
Aspose::Pdf::Permissions::PrintDocument,
Aspose::Pdf::CryptoAlgorithm::AESx256);
doc.Save("encrypted.pdf");
}
التعليقات التوضيحية
كل Page يكشف عن AnnotationCollection عبر Annotations(). يتم إنشاء TextAnnotation بالنسبة للمستند المالك، وتحديد موقعه بـ Rectangle، ثم إضافته إلى مجموعة الصفحة باستخدام Add().
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/text_annotation.hpp>
#include <aspose/pdf/rectangle.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
Aspose::Pdf::Annotations::TextAnnotation note(doc);
note.Rect(Aspose::Pdf::Rectangle(100.0, 700.0, 200.0, 720.0, false));
note.Contents("Reviewed - see section 2");
doc.Pages()[1].Annotations().Add(note);
doc.Save("annotated.pdf");
}
حقول AcroForm
Document.Form() تُعيد Form الخاص بالمستند، الذي يكشف الحقول الموجودة عبر Fields() كـ std::vector<Field*>. كل Field تُبلغ عن اسمه والقيمة الحالية عبر PartialName() وValue()، وForm.Flatten() تُدمج مظهر كل حقل في محتوى الصفحة، مما يزيل التفاعل.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("form.pdf");
auto& form = doc.Form();
std::cout << "Field count: " << form.Count() << "\n";
for (auto* field : form.Fields()) {
std::cout << field->PartialName() << " = " << field->Value() << "\n";
}
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)
افتح مستندًا، اطبع عدد صفحاته، استخرج نصه، وحوِّل الصفحة الأولى إلى ملف BMP:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/bmp_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::BmpDevice bmp(Aspose::Pdf::Devices::Resolution(150));
std::ofstream out("page1.bmp", std::ios::binary);
bmp.Process(doc.Pages()[1], out);
}
الصيغ المدعومة
| تنسيق | امتداد | قراءة | كتابة |
|---|---|---|---|
| BMP | .bmp | — | ✓ |
| JPEG | .jpg | — | ✓ |
| TIFF | .tiff | — | ✓ |
| Text | .txt | — | ✓ |
| SVG | .svg | ✓ | — |
BMP و JPEG و TIFF هما مخرجات عرض الصفحات التي تنتجها فئات الأجهزة الخاصة بهما. يتم استخراج النص من ملف PDF عبر TextAbsorber. يتم استيراد SVG كمحتوى متجه عبر مسار تحميل SVG في المكتبة.
المصدر المفتوح & الترخيص
Aspose.PDF FOSS لـ C++ موزع تحت رخصة MIT، مع توفر الشيفرة الكاملة على github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp. تسمح الرخصة بالاستخدام التجاري، والتعديل، وإعادة التوزيع دون الحاجة إلى اتفاق منفصل.