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.gitadd_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 buildEgy 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.