Jak pracować z fasadami API w Aspose.PDF FOSS for C++
Aspose.PDF FOSS for C++ grupuje zestaw wyższego poziomu klas fasad i edytorów — PdfExtractor, PdfBookmarkEditor, PdfContentEditor, PdfAnnotationEditor, FormEditor, PdfFileEditor i PdfConverter wśród nich — w przestrzeni nazw Aspose::Pdf::Facades. Każda z nich opakowuje pojedyncze zadanie utrzymania dokumentu na bazie rdzenia Document API, dzięki czemu możesz wyodrębniać treść, edytować zakładki lub wypełniać pola formularzy bez ręcznego implementowania przechodzenia po stronach i obiektach. Ten przewodnik skupia się na PdfExtractor, fasadzie używanej do pobierania osadzonych załączników plikowych, tekstu ze stron i osadzonych obrazów z istniejącego PDF.
Przewodnik krok po kroku
Krok 1: Zainstaluj pakiet
Dodaj Aspose.PDF FOSS for C++ jako podkatalog CMake i połącz cel biblioteki statycznej:
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)Upewnij się, że łańcuch narzędziowy i krok linkowania rozwiążą się poprawnie przed napisaniem jakiegokolwiek kodu fasady:
cmake -S . -B build
cmake --build buildCzysta kompilacja przy użyciu kompilatora C++20 potwierdza, że aspose_pdf_foss jest połączony z your_app.
Krok 2: Importuj wymagane klasy
PdfExtractor znajduje się pod aspose/pdf/facades/, obok Document z przestrzeni nazw core:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/facades/pdf_extractor.hpp>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Facades;Krok 3: Powiąż dokument z PdfExtractor
Każda klasa fasady dziedziczy po wspólnej bazie Facade, która udostępnia BindPdf(srcFile) i BindPdf(srcDoc) umożliwiając ich dołączenie do dokumentu po konstrukcji. PdfExtractor przyjmuje również już otwarty Document bezpośrednio w swoim konstruktorze, co jest wzorcem używanym w całym przewodniku:
Document doc("input.pdf");
PdfExtractor extractor(doc);Krok 4: Wyodrębnij osadzone załączniki plików
Najpierw sprawdź Document::EmbeddedFiles(), potem odczytaj nazwy załączników przy pomocy GetAttachNames() i wyciągnij bajty załącznika na dysk przy użyciu 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");
}Krok 5: Wyodrębnij tekst z każdej strony
ExtractText() po GetText() zapisuje cały tekst dokumentu do jednego pliku:
extractor.ExtractText();
extractor.GetText("extracted_text.txt");Aby zamiast tego przechwycić po jeden plik na stronę, ustaw zakres stron przy użyciu StartPage() / EndPage(), a następnie steruj HasNextPageText() / GetNextPageText() w pętli, przydzielając każdemu wywołaniu własną ścieżkę wyjściową:
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;
}Krok 6: Wyodrębnij osadzone obrazy
ExtractImage() inicjalizuje kursor obrazu; HasNextImage() / GetNextImage() następnie przechodzi po obrazach jeden po drugim, zapisując każdy do podanej ścieżki:
extractor.ExtractImage();
int imageIndex = 1;
while (extractor.HasNextImage()) {
std::string outputFile = "extracted_image_" + std::to_string(imageIndex);
if (extractor.GetNextImage(outputFile)) {
++imageIndex;
}
}Typowe problemy i rozwiązania
GetAttachNames() zwraca pusty wektor. Plik PDF źródłowy nie zawiera osadzonych plików. Sprawdź doc.EmbeddedFiles().Count() przed wywołaniem jakiejkolwiek metody załącznika na PdfExtractor aby nie próbować wyodrębnić z dokumentu, który nigdy nie miał załączników.
Pętla przetwarzająca tekst stron nigdy nie wchodzi w ciało. HasNextPageText() returns false natychmiast, jeśli StartPage() / EndPage() nie zostały nigdy ustawione, albo zostały ustawione na zakres wykraczający poza rzeczywistą liczbę stron dokumentu. Ustaw zakres wyraźnie od doc.Pages().Count() przed sprawdzeniem HasNextPageText().
GetNextImage() returns false przy pierwszym wywołaniu. ExtractImage() musi być wywołany raz, aby zainicjować kursor obrazu przed sprawdzeniem HasNextImage() lub wywołać GetNextImage(). Wywoływanie GetNextImage() bez wcześniejszego ExtractImage() wywołanie jest niezdefiniowane z perspektywy wywołującego — zawsze wywołuj ExtractImage() pierwszy.
Każdy wyodrębniony obraz lub plik tekstu strony nadpisuje poprzedni. GetNextImage() and GetNextPageText() każdy przyjmuje dosłowną ścieżkę wyjściową; fasada nie generuje dla Ciebie unikalnych nazw plików. Utwórz odrębną ścieżkę dla każdej iteracji (na przykład, dodając rosnący licznik) jak pokazano w Krokach 5 i 6.
Błąd linkowania: niezdefiniowane odwołanie do aspose_pdf_foss symboli. Confirm add_subdirectory() wskazuje na katalog główny sklonowanego repozytorium i że target_link_libraries() nazywa aspose_pdf_foss cel dokładnie, z ustawionym standardem C++20 dla your_app.
Najczęściej zadawane pytania
Jaka jest różnica między fasadami API a podstawowym dokumentem API?
Podstawowy Document API (Document, PageCollection, Annotation i tak dalej) udostępnia model obiektowy PDF bezpośrednio. Klasy fasady, takie jak PdfExtractor, opierają się na nim i pakują określone wieloetapowe zadanie — wyodrębnianie zawartości, edycję zakładek, wypełnianie pól formularzy — za węższym, specjalnie zaprojektowanym interfejsem.
Czy mogę edytować zakładki lub wypełniać pola formularzy w ten sam sposób, w jaki wyodrębniam zawartość za pomocą PdfExtractor?
Tak. PdfBookmarkEditor (z CreateBookmarks(), ModifyBookmarks(), ExtractBookmarks() i DeleteBookmarks()) oraz FormEditor (z AddField(), RemoveField() i SetFieldAttribute()) znajdują się w tej samej przestrzeni nazw Aspose::Pdf::Facades i stosują ten sam wzorzec include/construct pokazany w Krokach 2 i 3 — każdy działa tylko na innej części dokumentu.
Czy PdfExtractor może odczytać PDF zabezpieczony hasłem?
Ustaw hasło przed wywołaniem jakiejkolwiek metody ekstrakcji:
extractor.Password("owner-or-user-password");PdfExtractor::Password() jest prostą właściwością do odczytu/zapisu, więc musi być ustawiona przed ExtractText(), ExtractImage() lub metodami załączników.
Co się stanie, jeśli PDF nie zawiera tekstu, obrazów ani załączników do wyodrębnienia?
Nic nie wyrzuca wyjątku. GetAttachNames() zwraca pusty wektor, a HasNextPageText() / HasNextImage() zwracają false przy pierwszej kontroli, więc odpowiednie ciało pętli po prostu nigdy się nie wykonuje.
Który nagłówek powinienem dołączyć dla konkretnej klasy fasady?
Każda klasa fasady dostarcza własny nagłówek w aspose/pdf/facades/, odpowiadający nazwie klasy: pdf_extractor.hpp dla PdfExtractor, pdf_bookmark_editor.hpp dla PdfBookmarkEditor, form_editor.hpp dla FormEditor, oraz bookmark.hpp dla typów wartości Bookmark / Bookmarks.