Як працювати з Facades API у Aspose.PDF FOSS for C++
Aspose.PDF FOSS for C++ групує набір вищорівневих класів фасадів і редакторів — PdfExtractor, PdfBookmarkEditor, PdfContentEditor, PdfAnnotationEditor, FormEditor, PdfFileEditor та PdfConverter серед них — у просторі імен Aspose::Pdf::Facades. Кожен з них обгортає окреме завдання з обслуговування документу поверх ядра Document API, тому ви можете витягувати вміст, редагувати закладки або заповнювати поля форми без ручного написання коду для обходу сторінок та об’єктів. Цей посібник зосереджений на PdfExtractor, фасаді, який використовується для отримання вбудованих файлових вкладень, тексту сторінки та вбудованих зображень з існуючого PDF.
Покроковий посібник
Крок 1: Встановіть пакет
Додайте Aspose.PDF FOSS for C++ як підкаталог CMake і підключіть ціль статичної бібліотеки:
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.
Крок 2: Імпорт необхідних класів
PdfExtractor розташований під aspose/pdf/facades/, поряд з Document з простору імен core:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/facades/pdf_extractor.hpp>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Facades;Крок 3: Прив’язати документ до PdfExtractor
Кожен фасадний клас успадковується від спільної бази Facade, яка надає BindPdf(srcFile) та BindPdf(srcDoc) для приєднання її до документа після створення. PdfExtractor також приймає вже відкритий Document безпосередньо у своєму конструкторі, що є шаблоном, що використовується протягом усього посібника:
Document doc("input.pdf");
PdfExtractor extractor(doc);Крок 4: Витягнути вбудовані файлові вкладення
Спочатку перевірте 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");
}Крок 5: Витягнути текст з кожної сторінки
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;
}Крок 6: Витягнути вбудовані зображення
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() кожен приймає буквальний шлях виводу; фасад не генерує унікальні імена файлів для вас. Створіть окремий шлях для кожної ітерації (наприклад, додаючи зростаючий лічильник), як показано у кроках 5 і 6.
Помилка компоновки: невизначене посилання на aspose_pdf_foss символи. Confirm add_subdirectory() вказує на кореневу папку клонованого репозиторію і що target_link_libraries() називає aspose_pdf_foss ціль точно, з налаштованим стандартом C++20 для your_app.
Поширені запитання
У чому різниця між фасадами API та ядром Document API?
Ядро Document API (Document, PageCollection, Annotation тощо) безпосередньо відкриває модель об’єктів PDF. Класі фасади, такі як PdfExtractor, розташовані поверх нього і упаковують конкретне багатокрокове завдання — витяг вмісту, редагування закладок, заповнення полів форми — за вузьким, спеціально створеним інтерфейсом.
Чи можу я редагувати закладки або заповнювати поля форми так само, як витягаю вміст за допомогою PdfExtractor?
Так. PdfBookmarkEditor (з CreateBookmarks(), ModifyBookmarks(), ExtractBookmarks() та DeleteBookmarks()) і FormEditor (з AddField(), RemoveField() та SetFieldAttribute()) знаходяться в тому самому просторі імен Aspose::Pdf::Facades і слідують тому самому шаблону include/construct, показаному у кроках 2 і 3 — кожен працює лише з різною частиною документа.
Чи може PdfExtractor читати PDF, захищений паролем?
Встановіть пароль перед викликом будь-якого методу видобутку:
extractor.Password("owner-or-user-password");PdfExtractor::Password() — це простий властивість читання/запису, тому її потрібно встановити до ExtractText(), ExtractImage() або методів приєднання.
Що станеться, якщо у PDF немає тексту, зображень або вкладень для видобутку?
Нічого не викидається. GetAttachNames() повертає порожній вектор, а HasNextPageText() / HasNextImage() повертають false під час першої перевірки, тому відповідне тіло циклу просто ніколи не виконується.
Який заголовок підключити для конкретного фасадного класу?
Кожен фасадний клас постачається зі своїм заголовком у aspose/pdf/facades/, відповідно до назви класу: pdf_extractor.hpp для PdfExtractor, pdf_bookmark_editor.hpp для PdfBookmarkEditor, form_editor.hpp для FormEditor і bookmark.hpp для типів значень Bookmark / Bookmarks.