چگونه با Facades API در Aspose.PDF FOSS for C++ کار کنیم
Aspose.PDF FOSS برای C++ مجموعهای از کلاسهای فاساد و ویرایشگر سطح بالاتر را گروهبندی میکند — PdfExtractor، PdfBookmarkEditor، PdfContentEditor، PdfAnnotationEditor، FormEditor، PdfFileEditor و PdfConverter در میان آنها — در فضای نام Aspose::Pdf::Facades. هر یک یک کار نگهداری سند تک را بر روی هسته Document API میپیچند، به طوری که میتوانید محتوا را استخراج کنید، نشانکها را ویرایش کنید یا فیلدهای فرم را پر کنید بدون اینکه خودتان مسیرهای صفحه و شیء زیرین را بهصورت دستی پیادهسازی کنید. این راهنما بر PdfExtractor متمرکز است، فاسادی که برای استخراج پیوستهای فایل توکار، متن صفحه و تصاویر توکار از یک PDF موجود استفاده میشود.
راهنمای گام به گام
مرحله ۱: نصب بسته
بهعنوان یک زیرشاخه CMake، Aspose.PDF FOSS برای C++ را اضافه کنید و هدف کتابخانهٔ ایستا را لینک کنید:
git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp.gitadd_subdirectory(Aspose.PDF-FOSS-for-Cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)قبل از نوشتن هر کد فاساد، اطمینان حاصل کنید که ابزار زنجیره و مرحلهٔ لینک بهدرستی حل میشوند:
cmake -S . -B build
cmake --build buildیک ساخت پاک بر ضد کامپایلر C++20 تأیید میکند که aspose_pdf_foss به your_app لینک شده است.
مرحله ۲: وارد کردن کلاسهای مورد نیاز
PdfExtractor زیر aspose/pdf/facades/ قرار دارد، همراه با Document از فضای نام اصلی:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/facades/pdf_extractor.hpp>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Facades;مرحله ۳: اتصال یک سند به PdfExtractor
هر کلاس facade از یک پایهٔ مشترک Facade ارث میبرد که BindPdf(srcFile) و BindPdf(srcDoc) را برای اتصال به سند پس از ساختار فراهم میکند. PdfExtractor همچنین یک Document که از پیش باز است را مستقیماً در سازندهاش میپذیرد، که الگوی استفادهشده در تمام این راهنما است:
Document doc("input.pdf");
PdfExtractor extractor(doc);مرحله ۴: استخراج پیوستهای فایل جاسازیشده
ابتدا Document::EmbeddedFiles() را بررسی کنید، سپس نامهای پیوست را با GetAttachNames() بخوانید و بایتهای یک پیوست را با GetAttachment() به دیسک استخراج کنید:
#include <iostream>
if (doc.EmbeddedFiles().Count() > 0) {
std::vector<std::string> names = extractor.GetAttachNames();
for (const auto& name : names) {
std::cout << "Attachment: " << name << "\n";
}
// Writes the bytes of the first attachment to disk
extractor.GetAttachment("extracted_attachment.bin");
}مرحله ۵: استخراج متن از هر صفحه
ExtractText() بهدنبال GetText() تمام متن سند را در یک فایل واحد مینویسد:
extractor.ExtractText();
extractor.GetText("extracted_text.txt");برای بهدستآوردن یک فایل در هر صفحه بهجای این، بازهٔ صفحات را با StartPage() / EndPage() تنظیم کنید، سپس HasNextPageText() / GetNextPageText() را در یک حلقه اجرا کنید و به هر فراخوانی مسیر خروجی خاص خود را بدهید:
extractor.StartPage(1);
extractor.EndPage(doc.Pages().Count());
int pageNumber = extractor.StartPage();
while (extractor.HasNextPageText()) {
std::string outputFile = "page_" + std::to_string(pageNumber) + ".txt";
extractor.GetNextPageText(outputFile);
++pageNumber;
}مرحله ۶: استخراج تصاویر جاسازیشده
ExtractImage() مکاننمای تصویر را آماده میکند؛ HasNextImage() / GetNextImage() سپس بهصورت تکتک بر روی تصاویر پیمایش میکنند و هر کدام را در مسیری که میفرستید مینویسند:
extractor.ExtractImage();
int imageIndex = 1;
while (extractor.HasNextImage()) {
std::string outputFile = "extracted_image_" + std::to_string(imageIndex);
if (extractor.GetNextImage(outputFile)) {
++imageIndex;
}
}مشکلات رایج و راهحلها
GetAttachNames() یک بردار خالی برمیگرداند. فایل PDF منبع هیچ فایل جاسازیشدهای ندارد. بررسی کنید doc.EmbeddedFiles().Count() قبل از فراخوانی هر متد پیوست بر روی PdfExtractor تا سعی نکنید از سندی که هیچ پیوستی نداشته است استخراج کنید.
حلقه صفحه-متن هرگز به بدنه وارد نمیشود. HasNextPageText() returns false بلافاصله اگر StartPage() / EndPage() هرگز تنظیم نشدهاند، یا اگر به بازهای خارج از تعداد واقعی صفحات سند تنظیم شده باشند. بازه را بهصورت صریح از doc.Pages().Count() قبل از بررسی HasNextPageText().
GetNextImage() returns false در اولین فراخوانی. ExtractImage() باید یک بار فراخوانی شود تا نشانگر تصویر را آماده کند قبل از اینکه بررسی کنید HasNextImage() یا فراخوانی کنید GetNextImage(). فراخوانی GetNextImage() بدون یک فراخوانی قبلی ExtractImage() فراخوانی ExtractImage() اول.
هر تصویر یا فایل متن صفحه استخراج شده، فایل قبلی را بازنویسی میکند. GetNextImage() and GetNextPageText() هر یک مسیر خروجی واقعی را میگیرد؛ واسط برای شما نامهای فایل منحصر بهفردی تولید نمیکند. یک مسیر متمایز برای هر تکرار بسازید (به عنوان مثال، با افزودن یک شمارنده افزایشی) همانطور که در گامهای ۵ و ۶ نشان داده شده است.
خطای پیوند: ارجاع تعریف نشده به aspose_pdf_foss نمادها. Confirm add_subdirectory() به ریشه مخزن کلونشده اشاره میکند و اینکه target_link_libraries() نام میگیرد aspose_pdf_foss هدف را دقیقاً نام میبرد، با استاندارد C++20 تنظیمشده برای your_app.
سوالات متداول
تفاوت بین واسطهای API و سند اصلی API چیست؟
هسته Document API (Document، PageCollection، Annotation و غیره) مدل شیء PDF را بهصورت مستقیم در دسترس میگذارد. کلاسهای واسط مانند PdfExtractor بر روی آن قرار میگیرند و یک کار چندمرحلهای خاص — استخراج محتوا، ویرایش نشانکها، پر کردن فیلدهای فرم — را پشت یک رابط محدودتر و هدفمند بستهبندی میکنند.
آیا میتوانم نشانکها را ویرایش کنم یا فیلدهای فرم را به همان روشی که محتوا را با PdfExtractor استخراج میکنم، پر کنم؟
بله. PdfBookmarkEditor (با CreateBookmarks()، ModifyBookmarks()، ExtractBookmarks() و DeleteBookmarks()) و FormEditor (با AddField()، RemoveField() و SetFieldAttribute()) در همان فضای نام Aspose::Pdf::Facades قرار دارند و الگوی شامل/ساخت مشابهی را که در گامهای ۲ و ۳ نشان داده شده است، دنبال میکنند — هر کدام فقط بر روی بخش متفاوتی از سند عمل میکنند.
آیا PdfExtractor میتواند یک PDF محافظتشده با رمز عبور را بخواند؟
رمز عبور را قبل از فراخوانی هر روش استخراج تنظیم کنید:
extractor.Password("owner-or-user-password");PdfExtractor::Password() یک ویژگی ساده خواندنی/نوشتنی است، بنابراین باید قبل از ExtractText()، ExtractImage() یا روشهای پیوست تنظیم شود.
اگر PDF متن، تصویر یا پیوستی برای استخراج نداشته باشد، چه میشود؟
هیچ استثنایی پرتاب نمیشود. GetAttachNames() یک بردار خالی برمیگرداند و HasNextPageText() / HasNextImage() در اولین بررسی false را برمیگردانند، بنابراین بدنهٔ حلقهٔ مربوطه اصلاً اجرا نمیشود.
کدام هدر را برای یک کلاس facade خاص شامل کنم؟
هر کلاس facade هدر مخصوص خود را زیر aspose/pdf/facades/ ارائه میدهد، که نام کلاس را مطابقت میدهد: pdf_extractor.hpp برای PdfExtractor، pdf_bookmark_editor.hpp برای PdfBookmarkEditor، form_editor.hpp برای FormEditor، و bookmark.hpp برای انواع مقادیر Bookmark / Bookmarks.