مقدمه

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);
}

فرمت‌های پشتیبانی‌شده

قالبپسوندخواندننوشتن
BMPbmp—✓
JPEGjpeg—✓
TIFFtiff—✓
Texttxt—✓
SVGsvg✓—

منبع باز و مجوزها

Aspose.PDF FOSS برای C++ تحت مجوز MIT منتشر شده است که استفاده تجاری، تغییر و توزیع مجدد بدون حق امتیاز را مجاز می‌سازد. منبع در github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp موجود است.

استفاده تجاری تحت شرایط مجوز MIT مجاز است. اگر پروژه شما به پشتیبانی سطح سازمانی، پوشش فرمت‌های بیشتر یا ادغام ابری نیاز دارد، Aspose.PDF — Enterprise Product Family یک پیشنهاد تجاری جداگانه است.


شروع کار

منابع مرتبط