Hoe te werken met de Facades API in Aspose.PDF FOSS for C++
Aspose.PDF FOSS for C++ groepeert een set van hoger-niveau façade- en editorklassen — PdfExtractor, PdfBookmarkEditor, PdfContentEditor, PdfAnnotationEditor, FormEditor, PdfFileEditor en PdfConverter onder hen — in de Aspose::Pdf::Facades namespace. Elk van hen omsluit een enkele documentonderhoudstaak bovenop de kern Document API, zodat je inhoud kunt extraheren, bladwijzers kunt bewerken, of formulier-velden kunt invullen zonder zelf de onderliggende pagina- en object-wandelingen handmatig te implementeren. Deze gids richt zich op PdfExtractor, de façade die wordt gebruikt om ingebedde bestandsbijlagen, paginatekst en ingebedde afbeeldingen uit een bestaande PDF te halen.
Stapsgewijze handleiding
Stap 1: Installeer het pakket
Voeg Aspose.PDF FOSS for C++ toe als een CMake-subdirectory en link de statische bibliotheek-target:
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)Controleer of de toolchain en de linkstap correct worden opgelost voordat je enige façade-code schrijft:
cmake -S . -B build
cmake --build buildEen schone build met een C++20-compiler bevestigt dat aspose_pdf_foss is gelinkt in your_app.
Stap 2: Vereiste klassen importeren
PdfExtractor bevindt zich onder aspose/pdf/facades/, naast Document uit de core-namespace:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/facades/pdf_extractor.hpp>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Facades;Stap 3: Een document binden aan PdfExtractor
Elke façade-klasse is afgeleid van een gemeenschappelijke Facade-basis die BindPdf(srcFile) en BindPdf(srcDoc) blootlegt om deze na constructie aan een document te koppelen. PdfExtractor accepteert ook een al geopend Document direct in zijn constructor, wat het patroon is dat doorheen deze gids wordt gebruikt:
Document doc("input.pdf");
PdfExtractor extractor(doc);Stap 4: Ingesloten bestandsbijlagen extraheren
Controleer eerst Document::EmbeddedFiles(), lees vervolgens de bijlagennamen met GetAttachNames() en haal de bytes van een bijlage naar schijf met 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");
}Stap 5: Tekst van elke pagina extraheren
ExtractText() gevolgd door GetText() schrijft de volledige tekst van het document naar één enkel bestand:
extractor.ExtractText();
extractor.GetText("extracted_text.txt");Om in plaats daarvan één bestand per pagina vast te leggen, stel je het paginabereik in met StartPage() / EndPage(), en voer vervolgens HasNextPageText() / GetNextPageText() in een lus uit, waarbij je elke aanroep een eigen outputpad geeft:
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;
}Stap 6: Ingebedde afbeeldingen extraheren
ExtractImage() initialiseert de afbeeldingscursor; HasNextImage() / GetNextImage() lopen vervolgens de afbeeldingen één voor één af, en schrijven elk naar het pad dat je opgeeft:
extractor.ExtractImage();
int imageIndex = 1;
while (extractor.HasNextImage()) {
std::string outputFile = "extracted_image_" + std::to_string(imageIndex);
if (extractor.GetNextImage(outputFile)) {
++imageIndex;
}
}Veelvoorkomende problemen en oplossingen
GetAttachNames() geeft een lege vector terug. De bron-PDF heeft geen ingebedde bestanden. Controleer doc.EmbeddedFiles().Count() voordat een bijlage-methode wordt aangeroepen op PdfExtractor zodat je niet probeert te extraheren uit een document dat nooit bijlagen had.
De paginatekst-lus betreedt nooit de body. HasNextPageText() returns false onmiddellijk als StartPage() / EndPage() nooit waren ingesteld, of als ze waren ingesteld op een bereik buiten het werkelijke paginabereik van het document. Stel het bereik expliciet in vanaf doc.Pages().Count() voordat gecontroleerd wordt HasNextPageText().
GetNextImage() returns false bij de eerste oproep. ExtractImage() moet één keer worden aangeroepen om de image cursor te initialiseren voordat je controleert HasNextImage() of roep GetNextImage(). Aanroepen GetNextImage() zonder een eerdere ExtractImage() oproep is ongedefinieerd vanuit het perspectief van de aanroeper — altijd aanroepen ExtractImage() eerst.
Elke geëxtraheerde afbeelding of paginatekstbestand overschrijft de vorige. GetNextImage() and GetNextPageText() elk neemt een letterlijke uitvoerpad; de façade genereert geen unieke bestandsnamen voor je. Bouw een uniek pad per iteratie (bijvoorbeeld door een toenemende teller toe te voegen) zoals weergegeven in Stappen 5 en 6.
Linkfout: ongedefinieerde verwijzing naar aspose_pdf_foss symbolen. Confirm add_subdirectory() wijst naar de wortel van de gekloonde repository en dat target_link_libraries() noemt de aspose_pdf_foss doel precies, met een C++20-standaard geconfigureerd voor your_app.
Veelgestelde vragen
Wat is het verschil tussen de Facades API en de core Document API?
De core Document API (Document, PageCollection, Annotation, enzovoort) geeft het PDF-objectmodel rechtstreeks bloot. Facade-klassen zoals PdfExtractor zitten er bovenop en verpakken een specifieke meerstaps-taak — het extraheren van inhoud, bewerken van bladwijzers, invullen van formuliervelden — achter een smallere, doelgerichte interface.
Kan ik bladwijzers bewerken of formuliervelden invullen op dezelfde manier als ik inhoud extraheren met PdfExtractor?
Ja. PdfBookmarkEditor (met CreateBookmarks(), ModifyBookmarks(), ExtractBookmarks() en DeleteBookmarks()) en FormEditor (met AddField(), RemoveField() en SetFieldAttribute()) bevinden zich in dezelfde Aspose::Pdf::Facades namespace en volgen hetzelfde include/construct-patroon dat in Stappen 2 en 3 wordt getoond — elk werkt alleen op een ander deel van het document.
Kan PdfExtractor een met wachtwoord beveiligde PDF lezen?
Stel het wachtwoord in voordat je een extractiemethode aanroept:
extractor.Password("owner-or-user-password");PdfExtractor::Password() is een eenvoudige lees-/schrijf-eigenschap, dus moet deze vóór ExtractText(), ExtractImage() of de bijlage-methoden worden ingesteld.
Wat gebeurt er als de PDF geen tekst, afbeeldingen of bijlagen heeft om te extraheren?
Er wordt niets gegooid. GetAttachNames() retourneert een lege vector, en HasNextPageText() / HasNextImage() geven false terug bij de eerste controle, waardoor de corresponderende lusslichaam simpelweg nooit wordt uitgevoerd.
Welke header moet ik opnemen voor een specifieke façade-klasse?
Elke façade-klasse levert zijn eigen header onder aspose/pdf/facades/, passend bij de klassennaam: pdf_extractor.hpp voor PdfExtractor, pdf_bookmark_editor.hpp voor PdfBookmarkEditor, form_editor.hpp voor FormEditor, en bookmark.hpp voor de Bookmark / Bookmarks waardetypen.