Hur man arbetar med fasaderna API i Aspose.PDF FOSS for C++

Hur man arbetar med fasaderna API i Aspose.PDF FOSS for C++

Aspose.PDF FOSS för C++ grupperar en uppsättning högre nivåns fasad- och redigerarklasser — PdfExtractor, PdfBookmarkEditor, PdfContentEditor, PdfAnnotationEditor, FormEditor, PdfFileEditor och PdfConverter bland dem — i Aspose::Pdf::Facades namnrymd. Var och en omsluter en enskild dokumentunderhållsuppgift ovanpå kärnan Document API, så att du kan extrahera innehåll, redigera bokmärken eller fylla i formulärfält utan att själv skriva kod för de underliggande sid- och objektgångarna. Den här guiden fokuserar på PdfExtractor, fasaden som används för att hämta inbäddade filbilagor, sidtext och inbäddade bilder från en befintlig PDF.

Steg-för-steg guide

Steg 1: Installera paketet

Lägg till Aspose.PDF FOSS för C++ som en CMake-undermapp och länka det statiska biblioteksmålet:

git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp.git
add_subdirectory(Aspose.PDF-FOSS-for-Cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)

Bekräfta att verktygskedjan och länkningssteget löser sig korrekt innan du skriver någon fasadkod:

cmake -S . -B build
cmake --build build

En ren byggnad mot en C++20-kompilator bekräftar att aspose_pdf_foss är länkat till your_app.


Steg 2: Importera erforderliga klasser

PdfExtractor finns under aspose/pdf/facades/, tillsammans med Document från kärn-namnutrymmet:

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/facades/pdf_extractor.hpp>

using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Facades;

Steg 3: Binda ett dokument till PdfExtractor

Varje fasadklass härstammar från en gemensam Facade-bas som exponerar BindPdf(srcFile) och BindPdf(srcDoc) för att fästa den till ett dokument efter konstruktion. PdfExtractor accepterar också en redan öppen Document direkt i sin konstruktor, vilket är mönstret som används i hela den här guiden:

Document doc("input.pdf");
PdfExtractor extractor(doc);

Steg 4: Extrahera inbäddade filbilagor

Kontrollera Document::EmbeddedFiles() först, läs sedan bilagornas namn med GetAttachNames() och hämta en bilagas bytes till disk med 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");
}

Steg 5: Extrahera text från varje sida

ExtractText() följt av GetText() skriver hela dokumentets text till en enda fil:

extractor.ExtractText();
extractor.GetText("extracted_text.txt");

För att i stället fånga en fil per sida, ange sidintervallet med StartPage() / EndPage(), och kör sedan HasNextPageText() / GetNextPageText() i en loop, så att varje anrop får sin egen utdataväg:

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;
}

Steg 6: Extrahera inbäddade bilder

ExtractImage() förbereder bildpekaren; HasNextImage() / GetNextImage() går sedan igenom bilderna en i taget och skriver var och en till den sökväg du anger:

extractor.ExtractImage();

int imageIndex = 1;
while (extractor.HasNextImage()) {
    std::string outputFile = "extracted_image_" + std::to_string(imageIndex);
    if (extractor.GetNextImage(outputFile)) {
        ++imageIndex;
    }
}

Vanliga problem och lösningar

GetAttachNames() returnerar en tom vektor. Käll-PDF:en har inga inbäddade filer. Kontrollera doc.EmbeddedFiles().Count() innan du anropar någon attachment method på PdfExtractor så att du inte försöker extrahera från ett dokument som aldrig hade bilagor.

Slingan för sidtext går aldrig in i kroppen. HasNextPageText() returns false omedelbart om StartPage() / EndPage() aldrig sattes, eller om de sattes till ett intervall utanför dokumentets faktiska sidantal. Ställ in intervallet explicit från doc.Pages().Count() innan du kontrollerar HasNextPageText().

GetNextImage() returns false vid det första anropet. ExtractImage() måste anropas en gång för att förbereda bildmarkören innan du kontrollerar HasNextImage() eller anropa GetNextImage(). Anropar GetNextImage() utan ett föregående ExtractImage() anrop är odefinierat ur anroparens perspektiv — alltid anropa ExtractImage() först.

Varje extraherad bild eller sidtextfil skriver över den föregående. GetNextImage() and GetNextPageText() var och en tar en bokstavlig utdatamapp; fasaden genererar inte unika filnamn åt dig. Skapa en separat sökväg per iteration (till exempel genom att lägga till en räknare som ökar) som visas i steg 5 och 6.

Länkningsfel: odefinierad referens till aspose_pdf_foss symboler. Confirm add_subdirectory() pekar på rotkatalogen för det klonade arkivet och att target_link_libraries() namnger aspose_pdf_foss målet exakt, med en C++20-standard konfigurerad för your_app.

Vanliga frågor

Vad är skillnaden mellan Facaderna API och kärndokumentet API?

Kärnan Document API (Document, PageCollection, Annotation och så vidare) exponerar PDF-objektmodellen direkt. Facade-klasser som PdfExtractor ligger ovanpå den och paketera en specifik flerstegsuppgift — extrahera innehåll, redigera bokmärken, fylla i formulärfält — bakom ett snävare, ändamålsenligt gränssnitt.

Kan jag redigera bokmärken eller fylla i formulärfält på samma sätt som jag extraherar innehåll med PdfExtractor?

Ja. PdfBookmarkEditor (med CreateBookmarks(), ModifyBookmarks(), ExtractBookmarks() och DeleteBookmarks()) och FormEditor (med AddField(), RemoveField() och SetFieldAttribute()) finns i samma Aspose::Pdf::Facades namnrymd och följer samma include/construct-mönster som visas i Steg 2 och 3 — varje endast opererar på en annan del av dokumentet.

Kan PdfExtractor läsa en lösenordsskyddad PDF?

Ställ in lösenordet innan du anropar någon extraktionsmetod:

extractor.Password("owner-or-user-password");

PdfExtractor::Password() är en enkel läs/skriv-egenskap, så den måste sättas före ExtractText(), ExtractImage() eller bifogningsmetoderna.

Vad händer om PDF-filen inte har någon text, bilder eller bilagor att extrahera?

Inget kastas. GetAttachNames() returnerar en tom vektor, och HasNextPageText() / HasNextImage() returnerar false vid den första kontrollen, så motsvarande loopkropp körs helt enkelt aldrig.

Vilken header ska jag inkludera för en specifik fasadklass?

Varje fasadklass levereras med sin egen header under aspose/pdf/facades/, som matchar klassnamnet: pdf_extractor.hpp för PdfExtractor, pdf_bookmark_editor.hpp för PdfBookmarkEditor, form_editor.hpp för FormEditor, och bookmark.hpp för Bookmark / Bookmarks-värdetyperna.

Se även

 Svenska