Jak pracovat s PDF dokumenty v C++
Aspose.PDF FOSS pro C++ je knihovna licencovaná pod MIT, bez závislostí, C++20, vytvořená a linkovaná pomocí CMake — není potřeba žádný import z package manageru. Tento průvodce vás provede jádrovým workflow zaměřeným na Document: otevřít existující PDF, prozkoumat jeho stránky a metadata, extrahovat text a vykreslit stránku do rastrového obrázku.
Krok za krokem
Krok 1: Nainstalujte balíček
Naklonujte repozitář a přidejte jej do svého CMake projektu jako podadresář:
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)Nebo jej nakonfigurujte a sestavte samostatně:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build buildOvěřte, že toolchain funguje, kompilací minimálního programu proti hlavičkám:
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc;
std::cout << "Linked OK - pages: " << doc.Pages().Count() << "\n";
}Úspěšná kompilace, která vytiskne pages: 0 pro čerstvě vytvořený, prázdný Document, potvrzuje, že je knihovna správně propojena.
Krok 2: Naimportujte požadované třídy
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/document_info.hpp>
#include <aspose/pdf/page.hpp>
#include <aspose/pdf/page_collection.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
#include <iostream>Krok 3: Otevřete PDF dokument a spočítejte jeho stránky
Vytvořte Document z cesty k souboru pro otevření existujícího PDF. Document::Pages() vrací PageCollection a Count() udává, kolik stránek obsahuje:
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Page count: " << doc.Pages().Count() << "\n";Krok 4: Přečtěte metadata dokumentu
Document::Info() vrací objekt DocumentInfo s typovanými přístupy pro čtení/zápis ke standardním položkám slovníku /Info:
auto& info = doc.Info();
std::cout << "Title: " << info.Title() << "\n";
std::cout << "Author: " << info.Author() << "\n";
std::cout << "Producer: " << info.Producer() << "\n";Krok 5: Extrahujte text ze stránky
Aspose::Pdf::Text::TextAbsorber prochází Document nebo jedinou Page a shromažďuje nalezený text; Text() vrací výsledek následně. PageCollection je indexováno od 1, takže Pages()[1] je první stránka:
auto page = doc.Pages()[1];
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(page);
std::cout << absorber.Text() << "\n";Visit() také přijímá celý Document přímo (absorber.Visit(doc)), když chcete, aby byl text všech stránek spojen dohromady místo jedné stránky.
Krok 6: Vykreslit stránku do rastrového obrázku
BmpDevice vykresluje Page do nekomprimovaného BMP obrázku. Jeho konstruktor přijímá Resolution, který řídí výstupní DPI, a Process() zapisuje vykreslené bajty do libovolného std::ostream:
Aspose::Pdf::Devices::BmpDevice device(Aspose::Pdf::Devices::Resolution(150));
std::ofstream imageOut("page1.bmp", std::ios::binary);
device.Process(page, imageOut);Krok 7: Aktualizovat metadata a uložit dokument
Settery na DocumentInfo připravují změny, které jsou vyprázdněny při dalším spuštění Save() na vlastnickém Document:
doc.Info().Title("Processed by Aspose.PDF FOSS for C++");
doc.Save("output.pdf");Běžné problémy a opravy
Accessing Pages()[0] throws std::out_of_range
PageCollection je indexováno od 1, což odpovídá kanonické semantice Aspose.PDF — první stránka je Pages()[1]. Index menší než 1 nebo větší než Count() vyvolá výjimku.
TextAbsorber::Text() vrací prázdný řetězec
Text() vrací cokoliv, co bylo nahromaděno při posledním volání Visit(). Ověřte, že Visit() byl skutečně zavolán před čtením Text(), a že stránka nebo dokument, který jste navštívili, obsahuje extrahovatelný text, nikoli jen naskenované obrázky.
Vygenerovaný BMP soubor je neočekávaně malý nebo vypadá prázdně
Nízká hodnota Resolution vytváří malý rastrový obrázek. Zvyšte DPI předávané do Resolution — například Resolution(300) pro výstup v tiskové kvalitě — a ověřte, že index stránky předaný do Process() je ten, který jste zamýšleli.
DocumentInfo pole jsou načtena jako prázdné řetězce
Ne každý tvůrce PDF zapisuje standardní položky /Info. Zkontrolujte Producer() a Creator() na prázdné hodnoty, než předpokládáte, že extrakce metadat selhala — prázdný řetězec je definovaný výsledek pro chybějící klíč.
Změny provedené pomocí Info().Title(...) se neobjeví v uloženém souboru
DocumentInfo mutace jsou připraveny v paměti a jsou uloženy až při dalším spuštění Save() na stejné instanci Document. Ujistěte se, že úprava metadat proběhne před Save(), ne po ní.
Často kladené otázky
Je indexování stránek v Aspose.PDF FOSS pro C++ nulové nebo jedničkové?
Jedničkové. doc.Pages()[1] je vždy první stránka.
Může TextAbsorber extrahovat text z jedné stránky místo celého dokumentu?
Ano. Visit() je přetíženo tak, aby přijímalo buď Document — který extrahuje text ze všech stránek — nebo jediný Page, který extrahuje text pouze z této stránky.
Musím volat Save(), pokud jen čtu data z dokumentu?
Ne. Save() je potřeba pouze po změnách, které je nutné zapsat zpět do souboru, jako je úprava polí DocumentInfo. Čtení počtu stránek, extrahování textu nebo vykreslování stránky dokument nemodifikuje.
Jak mohu ovládat rozlišení vykreslené stránky?
Předávejte hodnotu Resolution do konstruktoru zařízení — například Resolution(150) pro 150 DPI. Vyšší hodnoty vytvářejí větší, vysoce věrné rastrové obrázky.
Jaký formát vytváří BmpDevice?
Nekomprimovaný BMP obrázek zapsaný přímo do std::ostream předaného Process().