Jak pracovat s fasádami API v Aspose.PDF FOSS for C++
Aspose.PDF FOSS for C++ seskupuje sadu vyšší úrovně fasádových a editačních tříd — PdfExtractor, PdfBookmarkEditor, PdfContentEditor, PdfAnnotationEditor, FormEditor, PdfFileEditor a PdfConverter mezi nimi — v jmenném prostoru Aspose::Pdf::Facades. Každá z nich obaluje jediný úkol údržby dokumentu nad jádrem Document API, takže můžete extrahovat obsah, upravovat záložky nebo vyplňovat formulářová pole, aniž byste museli ručně implementovat procházení stránek a objektů. Tento průvodce se zaměřuje na PdfExtractor, fasádu používanou k získání vložených souborových příloh, textu stránky a vložených obrázků ze stávajícího PDF.
Krok za krokem
Krok 1: Nainstalujte balíček
Přidejte Aspose.PDF FOSS for C++ jako podadresář CMake a propojte cíl statické knihovny:
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)Ověřte, že toolchain a krok linkování jsou správně vyřešeny, než začnete psát jakýkoli kód fasády:
cmake -S . -B build
cmake --build buildČistá kompilace pomocí kompilátoru C++20 potvrdí, že aspose_pdf_foss je propojen do your_app.
Krok 2: Naimportujte požadované třídy
PdfExtractor se nachází pod aspose/pdf/facades/, vedle Document z jádrového jmenného prostoru:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/facades/pdf_extractor.hpp>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Facades;Krok 3: Navázat dokument na PdfExtractor
Každá třída fasády dědí ze společné základny Facade, která zpřístupňuje BindPdf(srcFile) a BindPdf(srcDoc) pro připojení k dokumentu po konstrukci. PdfExtractor také přijímá již otevřený Document přímo ve svém konstruktoru, což je vzor používaný v celém tomto průvodci:
Document doc("input.pdf");
PdfExtractor extractor(doc);Krok 4: Extrahovat vložené souborové přílohy
Nejprve zkontrolujte Document::EmbeddedFiles(), poté načtěte názvy příloh pomocí GetAttachNames() a stáhněte bajty přílohy na disk pomocí 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");
}Krok 5: Extrahovat text z každé stránky
ExtractText() následovaný GetText() zapíše celý text dokumentu do jediného souboru:
extractor.ExtractText();
extractor.GetText("extracted_text.txt");Chcete-li zachytit jeden soubor na stránku, nastavte rozsah stránek pomocí StartPage() / EndPage() a poté ve smyčce ovládejte HasNextPageText() / GetNextPageText(), přičemž každému volání přiřaďte vlastní výstupní cestu:
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;
}Krok 6: Extrahovat vložené obrázky
ExtractImage() připraví kurzor obrázků; HasNextImage() / GetNextImage() pak prochází obrázky jeden po druhém a zapisuje každý do cesty, kterou zadáte:
extractor.ExtractImage();
int imageIndex = 1;
while (extractor.HasNextImage()) {
std::string outputFile = "extracted_image_" + std::to_string(imageIndex);
if (extractor.GetNextImage(outputFile)) {
++imageIndex;
}
}Časté problémy a opravy
GetAttachNames() vrací prázdný vektor. Zdrojový PDF nemá žádné vložené soubory. Zkontrolujte doc.EmbeddedFiles().Count() před voláním jakékoli metody přílohy na PdfExtractor aby se nepokusil o extrakci z dokumentu, který nikdy neměl žádné přílohy.
Smyčka stránkového textu nikdy nevstoupí do těla. HasNextPageText() returns false okamžitě, pokud StartPage() / EndPage() nikdy nebyly nastaveny, nebo byly nastaveny na rozsah mimo skutečný počet stránek dokumentu. Nastavte rozsah explicitně od doc.Pages().Count() před kontrolou HasNextPageText().
GetNextImage() returns false při prvním volání. ExtractImage() musí být zavolána jednou k inicializaci kurzoru obrázku před tím, než zkontrolujete HasNextImage() nebo zavolat GetNextImage(). Volání GetNextImage() bez předchozí ExtractImage() volání je z pohledu volajícího nedefinováno — vždy volejte ExtractImage() první.
Každý extrahovaný obrázek nebo soubor s textem stránky přepíše předchozí. GetNextImage() and GetNextPageText() každý vezme doslovnou výstupní cestu; fasáda pro vás nevytváří jedinečná jména souborů. Vytvořte odlišnou cestu pro každou iteraci (například přidáním inkrementujícího čítače) tak, jak je ukázáno v krocích 5 a 6.
Chyba linkování: nedefinovaná reference na aspose_pdf_foss symboly. Confirm add_subdirectory() ukazuje na kořen klonovaného repozitáře a že target_link_libraries() pojmenovává aspose_pdf_foss cíl přesně, s nastaveným standardem C++20 pro your_app.
Často kladené otázky
Jaký je rozdíl mezi fasádami API a jádrem Document API?
Jádro Document API (Document, PageCollection, Annotation a tak dále) přímo vystavuje model objektů PDF. Třídy fasády jako PdfExtractor na ně navazují a zabalí konkrétní vícestupňový úkol — extrakci obsahu, úpravu záložek, vyplňování polí formuláře — za užší, speciálně vytvořené rozhraní.
Mohu upravovat záložky nebo vyplňovat pole formuláře stejným způsobem, jakým extrahuji obsah pomocí PdfExtractor?
Ano. PdfBookmarkEditor (s CreateBookmarks(), ModifyBookmarks(), ExtractBookmarks() a DeleteBookmarks()) a FormEditor (s AddField(), RemoveField() a SetFieldAttribute()) žijí ve stejném Aspose::Pdf::Facades namespace a následují stejný vzor include/construct ukázaný v krocích 2 a 3 — každý operuje jen s jinou částí dokumentu.
Může PdfExtractor číst PDF chráněné heslem?
Nastavte heslo před voláním jakékoli metody extrakce:
extractor.Password("owner-or-user-password");PdfExtractor::Password() je jednoduchá vlastnost pro čtení/zápis, takže musí být nastaveno před ExtractText(), ExtractImage() nebo metodami příloh.
Co se stane, pokud PDF neobsahuje žádný text, obrázky ani přílohy k extrakci?
Nedošlo k žádné výjimce. GetAttachNames() vrací prázdný vektor a HasNextPageText() / HasNextImage() vrací false při první kontrole, takže odpovídající tělo smyčky se prostě nikdy neprovede.
Jaký hlavičkový soubor mám zahrnout pro konkrétní třídu fasády?
Každá třída fasády obsahuje vlastní hlavičkový soubor v aspose/pdf/facades/, který odpovídá názvu třídy: pdf_extractor.hpp pro PdfExtractor, pdf_bookmark_editor.hpp pro PdfBookmarkEditor, form_editor.hpp pro FormEditor a bookmark.hpp pro typy hodnot Bookmark / Bookmarks.