Jak pracovat s PDF dokumenty v C++

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.git
add_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 build

Ověř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().

Viz také:

 Čeština