Cum să lucraţi cu Fațadele API în Aspose.PDF FOSS for C++
Aspose.PDF FOSS pentru C++ grupează un set de clase de fațadă și editor de nivel superior — PdfExtractor, PdfBookmarkEditor, PdfContentEditor, PdfAnnotationEditor, FormEditor, PdfFileEditor și PdfConverter printre ele — în spațiul de nume Aspose::Pdf::Facades. Fiecare învelește o singură sarcină de întreținere a documentului, pe baza nucleului Document API, astfel încât să puteți extrage conținut, edita semne de carte sau completa câmpuri de formular fără să implementați manual traversările paginilor și obiectelor. Acest ghid se concentrează pe PdfExtractor, fațada utilizată pentru a extrage atașamente de fișiere încorporate, textul paginii și imagini încorporate dintr-un PDF existent.
Ghid pas cu pas
Pasul 1: Instalați pachetul
Adăugați Aspose.PDF FOSS pentru C++ ca subdirector CMake și legați ținta bibliotecii statice:
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)Confirmați că lanțul de instrumente și pasul de legare se rezolvă corect înainte de a scrie orice cod de fațadă:
cmake -S . -B build
cmake --build buildO compilare curată cu un compilator C++20 confirmă că aspose_pdf_foss este legat în your_app.
Pasul 2: Importă clasele necesare
PdfExtractor se află sub aspose/pdf/facades/, alături de Document din spațiul de nume principal:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/facades/pdf_extractor.hpp>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Facades;Pasul 3: Leagă un document de PdfExtractor
Fiecare clasă facade derivă dintr-o bază comună Facade care expune BindPdf(srcFile) și BindPdf(srcDoc) pentru a o atașa la un document după construcție. PdfExtractor acceptă, de asemenea, un Document deja deschis direct în constructorul său, care este modelul utilizat pe parcursul acestui ghid:
Document doc("input.pdf");
PdfExtractor extractor(doc);Pasul 4: Extrage atașamentele de fișiere încorporate
Verifică mai întâi Document::EmbeddedFiles(), apoi citește numele atașamentelor cu GetAttachNames() și extrage octeții unui atașament pe disc cu 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");
}Pasul 5: Extrage textul din fiecare pagină
ExtractText() urmat de GetText() scrie textul întregului document într-un singur fișier:
extractor.ExtractText();
extractor.GetText("extracted_text.txt");Pentru a captura un fișier pe pagină în schimb, setează intervalul de pagini cu StartPage() / EndPage(), apoi rulează HasNextPageText() / GetNextPageText() într-o buclă, oferind fiecărui apel propria cale de ieșire:
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;
}Pasul 6: Extrage imaginile încorporate
ExtractImage() inițializează cursorul de imagini; HasNextImage() / GetNextImage() apoi parcurge imaginile una câte una, scriind fiecare în calea pe care o furnizezi:
extractor.ExtractImage();
int imageIndex = 1;
while (extractor.HasNextImage()) {
std::string outputFile = "extracted_image_" + std::to_string(imageIndex);
if (extractor.GetNextImage(outputFile)) {
++imageIndex;
}
}Probleme comune și soluții
GetAttachNames() returnează un vector gol. PDF-ul sursă nu are fișiere încorporate. Verificați doc.EmbeddedFiles().Count() înainte de a apela orice metodă de atașament pe PdfExtractor pentru a nu încerca să extrageți dintr-un document care nu a avut niciodată atașamente.
Bucla de text pe pagină nu intră niciodată în corp. HasNextPageText() returns false imediat dacă StartPage() / EndPage() nu au fost niciodată stabilite, sau dacă au fost stabilite la un interval în afara numărului real de pagini al documentului. Stabiliți intervalul explicit de la doc.Pages().Count() înainte de verificare HasNextPageText().
GetNextImage() returns false la primul apel. ExtractImage() trebuie să fie apelat o singură dată pentru a inițializa cursorul de imagine înainte de a verifica HasNextImage() sau să apelezi GetNextImage(). Apelând GetNextImage() fără un precedent ExtractImage() apel este nedefinit din perspectiva apelantului — întotdeauna apelează ExtractImage() prima.
Fiecare imagine extrasă sau fișier de text al paginii suprascrie pe cel precedent. GetNextImage() and GetNextPageText() fiecare ia o cale de ieșire literală; fațada nu generează nume de fișiere unice pentru tine. Construiește o cale distinctă pentru fiecare iterație (de exemplu, adăugând un contor incrementabil) așa cum se arată în Pașii 5 și 6.
Eroare de legătură: referință nedefinită la aspose_pdf_foss simboluri. Confirm add_subdirectory() indică rădăcina depozitului clonat și că target_link_libraries() numează aspose_pdf_foss ținta exactă, cu un standard C++20 configurat pentru your_app.
Întrebări frecvente
Care este diferența dintre Fațadele API și Documentul de bază API?
Nucleul Document API (Document, PageCollection, Annotation și altele) expune direct modelul de obiecte PDF. Clasele fațadă, cum ar fi PdfExtractor, se așază deasupra acestuia și împachetează o sarcină specifică multi-pas — extragerea conținutului, editarea semnelor de carte, completarea câmpurilor de formular — în spatele unei interfețe mai restrânse, create special pentru scop.
Pot edita semnele de carte sau completa câmpurile de formular în același mod în care extrag conținutul cu PdfExtractor?
Da. PdfBookmarkEditor (cu CreateBookmarks(), ModifyBookmarks(), ExtractBookmarks() și DeleteBookmarks()) și FormEditor (cu AddField(), RemoveField() și SetFieldAttribute()) trăiesc în același spațiu de nume Aspose::Pdf::Facades și urmează același model de includere/constructie prezentat în Pașii 2 și 3 — fiecare operează doar pe o parte diferită a documentului.
Poate PdfExtractor să citească un PDF protejat prin parolă?
Setați parola înainte de a apela orice metodă de extragere:
extractor.Password("owner-or-user-password");PdfExtractor::Password() este o proprietate simplă de citire/scriere, așa că trebuie setată înainte de ExtractText(), ExtractImage() sau metodele de atașare.
Ce se întâmplă dacă PDF-ul nu are text, imagini sau atașamente de extras?
Nu se aruncă nicio excepție. GetAttachNames() returnează un vector gol, iar HasNextPageText() / HasNextImage() returnează false la prima verificare, astfel încât corpul buclei corespunzătoare pur și simplu nu se execută.
Ce antet trebuie să includ pentru o clasă facadă specifică?
Fiecare clasă facadă furnizează propriul său antet în aspose/pdf/facades/, care corespunde numelui clasei: pdf_extractor.hpp pentru PdfExtractor, pdf_bookmark_editor.hpp pentru PdfBookmarkEditor, form_editor.hpp pentru FormEditor, și bookmark.hpp pentru tipurile de valori Bookmark / Bookmarks.