PDF dokumentumok kezelése C++-ban

PDF dokumentumok kezelése C++-ban

Aspose.PDF FOSS for C++ egy MIT licencű, függőségmentes C++20 könyvtár, amely CMake-el épül és linkel — nincs csomagkezelő import, amit hozzá kellene adni. Ez az útmutató végigvezeti a Document-központú munkafolyamaton: egy meglévő PDF megnyitása, az oldalak és metaadatok ellenőrzése, szöveg kinyerése, és egy oldal raster képbe renderelése.

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

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

Klónozd a repót, és add hozzá a CMake projektedhez alkönyvtárként:

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)

Vagy konfiguráld és építsd önállóan:

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build

Ellenőrizd, hogy a toolchain feloldja-e a hivatkozásokat egy minimális programot a fejlécek ellen fordítva:

#include <aspose/pdf/document.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc;
    std::cout << "Linked OK - pages: " << doc.Pages().Count() << "\n";
}

Egy sikeres fordítás, amely pages: 0 értéket nyomtat a frissen létrehozott, üres Document esetén, megerősíti, hogy a könyvtár helyesen van linkelve.


Step 2: Szükséges osztályok importálása

#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>

Step 3: PDF-dokumentum megnyitása és az oldalak számolása

Hozzon létre egy Document-t fájlútvonalból egy meglévő PDF megnyitásához. Document::Pages() visszaadja a PageCollection-t, és Count() jelzi, hány oldal található benne:

Aspose::Pdf::Document doc("input.pdf");
std::cout << "Page count: " << doc.Pages().Count() << "\n";

Step 4: Dokumentum metaadatok olvasása

Document::Info() visszaad egy DocumentInfo objektumot, amely típusos olvasási/írási hozzáférőkkel rendelkezik a szabványos /Info szótári bejegyzésekhez:

auto& info = doc.Info();
std::cout << "Title: "    << info.Title()    << "\n";
std::cout << "Author: "   << info.Author()   << "\n";
std::cout << "Producer: " << info.Producer() << "\n";

Step 5: Szöveg kinyerése egy oldalról

Aspose::Pdf::Text::TextAbsorber bejár egy Document-t vagy egyetlen Page-t, és összegyűjti a megtalált szöveget; Text() ezután visszaadja az eredményt. PageCollection 1-től indexelt, ezért Pages()[1] az első oldal:

auto page = doc.Pages()[1];

Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(page);
std::cout << absorber.Text() << "\n";

Visit() közvetlenül is elfogadja a teljes Document-t (absorber.Visit(doc)), ha minden oldal szövegét egyetlen szövegként szeretnéd összefűzni egyetlen oldal helyett.


6. lépés: Az oldal raszteres képre való renderelése

BmpDevice egy Page-t renderel egy tömörítetlen BMP képre. A konstruktor egy Resolution-t vár, amely szabályozza a kimeneti DPI-t, és a Process() a renderelt bájtokat bármilyen std::ostream-ba írja:

Aspose::Pdf::Devices::BmpDevice device(Aspose::Pdf::Devices::Resolution(150));

std::ofstream imageOut("page1.bmp", std::ios::binary);
device.Process(page, imageOut);

7. lépés: Metaadatok frissítése és a dokumentum mentése

A DocumentInfo setterei olyan módosításokat jelölnek, amelyek a következő alkalommal kerülnek kiürítésre, amikor a Save() lefut a tulajdonos Document-n:

doc.Info().Title("Processed by Aspose.PDF FOSS for C++");
doc.Save("output.pdf");

Gyakori problémák és megoldások

Accessing Pages()[0] throws std::out_of_range

PageCollection 1-alapú, a kanonikus Aspose.PDF szemantika szerint — az első oldal Pages()[1]. Az 1 alatti vagy Count() feletti index hibát okoz.

TextAbsorber::Text() visszaad egy üres karakterláncot

Text() azt adja vissza, ami a legutóbbi Visit() hívás során felgyűlt. Ellenőrizze, hogy a Visit() valóban meghívásra került-e, mielőtt a Text() beolvasásra kerül, és hogy a meglátogatott oldal vagy dokumentum kinyerhető szöveget tartalmaz-e, nem csak beolvasott képeket.

A renderelt BMP fájl váratlanul kicsi vagy üresnek tűnik

Az alacsony Resolution érték kis raszterképet eredményez. Növelje a Resolution számára átadott DPI-t — például Resolution(300) nyomtatási minőségű kimenethez — és ellenőrizze, hogy a Process() számára átadott oldal index a kívánt legyen.

DocumentInfo a mezők visszaolvasáskor üres karakterláncok

Nem minden PDF előállító ír szabványos /Info bejegyzéseket. Ellenőrizze a Producer() és Creator() értékét üres értékekre, mielőtt azt feltételezné, hogy a metaadat-kivonás sikertelen — az üres karakterlánc a hiányzó kulcs definiált eredménye.

A módosítások a Info().Title(...) nem jelennek meg a mentett fájlban

DocumentInfo módosításai a memóriában kerülnek előkészítésre, és csak a következő alkalommal kerülnek tartósításra, amikor Save() lefut ugyanazon a Document példányon. Győződjön meg róla, hogy a metaadat-szerkesztés Save() előtt történik, ne utána.

Gyakran Ismételt Kérdések

A lapindexelés nulla-alapú vagy egy-alapú a Aspose.PDF FOSS for C++-ban?

Egy-alapú. doc.Pages()[1] mindig az első oldal.

Kivonhat a TextAbsorber szöveget egyetlen oldalról a teljes dokumentum helyett?

Igen. A Visit() túlterhelt, hogy elfogadjon vagy egy Document – amely minden oldal szövegét kinyeri –, vagy egyetlen Page – amely csak az adott oldal szövegét nyeri ki.

Kell-e meghívni a Save()-t, ha csak adatot olvasok a dokumentumból?

Nem. A Save() csak akkor szükséges, ha olyan módosítások történnek, amelyeket vissza kell írni egy fájlba, például a DocumentInfo mezők szerkesztése esetén. Az oldalszám olvasása, a szöveg kinyerése vagy egy oldal renderelése nem módosítja a dokumentumot.

Hogyan szabályozhatom egy renderelt oldal felbontását?

Adjon át egy Resolution értéket az eszköz konstruktorának — például Resolution(150) 150 DPI-hez. A magasabb értékek nagyobb, nagyobb pontosságú raszteres képeket eredményeznek.

Milyen formátumot állít elő a BmpDevice?

Egy tömörítetlen BMP kép, amely közvetlenül a std::ostream-ba íródik, amit a Process() kap.

Lásd még:

 Magyar