Hogyan dolgozzunk a API felületekkel a Aspose.PDF FOSS for C++-ban

Hogyan dolgozzunk a API felületekkel a Aspose.PDF FOSS for C++-ban

Aspose.PDF FOSS for C++ egy haladóbb szintű felület- és szerkesztőosztályok halmazát csoportosítja — PdfExtractor, PdfBookmarkEditor, PdfContentEditor, PdfAnnotationEditor, FormEditor, PdfFileEditor és PdfConverter közöttük — a Aspose::Pdf::Facades névtérben. Mindegyik egyetlen dokumentumkarbantartási feladatot burkol be a mag Document API tetején, így tartalmat nyerhet ki, könyvjelzőket szerkeszthet, vagy űrlapmezőket tölthet ki anélkül, hogy saját kezűleg kellene a mögöttes oldal- és objektumlépéseket kezelni. Ez az útmutató a PdfExtractor felületre összpontosít, amely beágyazott fájlcsatolmányok, oldal szöveg és beágyazott képek kinyerésére szolgál egy meglévő PDF-ből.

Lépésről lépésre útmutató

1. lépés: A csomag telepítése

Adja hozzá a Aspose.PDF FOSS for C++-t CMake alkönyvtárként, és kapcsolja a statikus könyvtárcélhoz:

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)

Ellenőrizze, hogy az eszközkészlet és a linkelési lépés helyesen feloldódik, mielőtt bármilyen felületkódot írna:

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

Egy tiszta build C++20 fordítóval megerősíti, hogy a aspose_pdf_foss be van linkelve a your_app-be.


2. lépés: A szükséges osztályok importálása

PdfExtractor a aspose/pdf/facades/ alatt helyezkedik el, a core névtérből származó Document mellett:

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

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

3. lépés: Dokumentum kötése a PdfExtractor objektumhoz

Minden felület osztály egy közös Facade alaposztályból származik, amely ki teszi a BindPdf(srcFile) és a BindPdf(srcDoc) lehetőségeket, hogy az építés után egy dokumentumhoz csatolhassuk. A PdfExtractor szintén közvetlenül a konstruktorában elfogad egy már nyitott Document példányt, ami a teljes útmutatóban használt minta:

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

4. lépés: Beágyazott fájlcsatolmányok kinyerése

Először ellenőrizze a Document::EmbeddedFiles() értéket, majd olvassa be a csatolmányok neveit a GetAttachNames() segítségével, és a GetAttachment() használatával mentse a csatolmány bájtjait a lemezre:

#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. lépés: Szöveg kinyerése minden oldalról

ExtractText() majd GetText() a teljes dokumentum szövegét egyetlen fájlba írja:

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

Az egy oldalra egy fájl rögzítése helyett állítsa be az oldaltartományt a StartPage() / EndPage() segítségével, majd egy ciklusban hajtsa végre a HasNextPageText() / GetNextPageText() parancsot, minden hívásnak saját kimeneti útvonalat adva:

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. lépés: Beágyazott képek kinyerése

ExtractImage() előkészíti a képkurzort; HasNextImage() / GetNextImage() ezután egyesével bejárja a képeket, mindegyiket a megadott útvonalra írva:

extractor.ExtractImage();

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

Gyakori problémák és megoldások

GetAttachNames() üres vektort ad vissza. A forrás PDF-nek nincsenek beágyazott fájljai. Ellenőrizze doc.EmbeddedFiles().Count() mielőtt bármilyen csatolási metódust meghívna PdfExtractor így elkerülheti, hogy olyan dokumentumból próbáljon kinyerni, amelynek sosem voltak csatolmányai.

Az oldal-szöveg ciklus sosem lép be a törzsbe. HasNextPageText() returns false azonnal, ha StartPage() / EndPage() soha nem lettek beállítva, vagy ha a dokumentum tényleges oldalszáma alapján kívül eső tartományra lettek állítva. Állítsa be a tartományt kifejezetten a következőből doc.Pages().Count() ellenőrzés előtt HasNextPageText().

GetNextImage() returns false az első híváskor. ExtractImage() egyszer kell meghívni a képkurzor előkészítéséhez, mielőtt ellenőriznéd HasNextImage() vagy hív GetNextImage(). A meghívás GetNextImage() korábbi nélkül ExtractImage() hívás ExtractImage() először.

Minden kinyert kép vagy oldal-szöveg fájl felülírja az előzőt. GetNextImage() and GetNextPageText() mindegyik egy konkrét kimeneti útvonalat vesz fel; a felület nem generál egyedi fájlneveket helyetted. Építs egy megkülönböztetett útvonalat minden iterációhoz (például egy növekvő számláló hozzáfűzésével), ahogyan az 5. és 6. lépésben látható.

Link hiba: undefined reference to aspose_pdf_foss szimbólumok. Confirm add_subdirectory() a klónozott tároló gyökerére mutat, és hogy target_link_libraries() nevezi a aspose_pdf_foss célpontot pontosan, egy C++20 szabvánnyal konfigurálva a your_app.

Gyakran Ismételt Kérdések

Mi a különbség a API felületek és a API mag Dokumentum között?

A mag Document API (Document, PageCollection, Annotation stb.) közvetlenül eléri a PDF objektummodellt. Olyan felületi osztályok, mint a PdfExtractor, erre épülnek, és egy adott többlépéses feladatot — tartalom kinyerése, könyvjelzők szerkesztése, űrlapmezők kitöltése — egy szűkebb, célra szabott interfész mögé csomagolnak.

Szerkeszthetek könyvjelzőket vagy tölthetek ki űrlapmezőket ugyanúgy, ahogy a PdfExtractor használatával tartalmat nyerek ki?

Igen. A PdfBookmarkEditor (a CreateBookmarks(), ModifyBookmarks(), ExtractBookmarks() és DeleteBookmarks() elemekkel) és a FormEditor (a AddField(), RemoveField() és SetFieldAttribute() elemekkel) ugyanabban a Aspose::Pdf::Facades névtérben élnek, és ugyanazt a lépés 2-ben és 3-ban bemutatott include/konstrukció mintát követik — mindegyik csak a dokumentum egy másik részén működik.

Olvasni tudja a PdfExtractor a jelszóval védett PDF-et?

Állítsa be a jelszót, mielőtt bármelyik kinyerési metódust meghívná:

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

PdfExtractor::Password() egy egyszerű olvasás/írás tulajdonság, ezért be kell állítani a ExtractText(), ExtractImage() vagy a csatolási metódusok előtt.

Mi történik, ha a PDF-nek nincs szövege, képe vagy kinyerhető csatolmánya?

Semmi sem dob kivételt. GetAttachNames() egy üres vektort ad vissza, és a HasNextPageText() / HasNextImage() false-t ad vissza az első ellenőrzéskor, ezért a megfelelő ciklusmag egyszerűen soha nem fut le.

Melyik header-t kell inkludálnom egy adott facade osztályhoz?

Minden facade osztály saját header-t tartalmaz a aspose/pdf/facades/ alatt, a osztály nevének megfelelően: pdf_extractor.hpp a PdfExtractor számára, pdf_bookmark_editor.hpp a PdfBookmarkEditor számára, form_editor.hpp a FormEditor számára, és bookmark.hpp a Bookmark / Bookmarks értéktípusokhoz.

Lásd még:

 Magyar