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.gitadd_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 buildEllenő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.