Cum să lucrați cu documente PDF în C++
Aspose.PDF FOSS pentru C++ este o bibliotecă C++20 licențiată sub MIT, fără dependențe, construită și legată cu CMake — nu există nicio importare prin manager de pachete de adăugat. Acest ghid parcurge fluxul de lucru centrat pe Document: deschide un PDF existent, inspectează paginile și metadatele sale, extrage text și redă o pagină ca imagine raster.
Ghid pas cu pas
Pasul 1: Instalează pachetul
Clonează depozitul și adaugă-l în proiectul tău CMake ca subdirector:
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)Sau configurează-l și compilează-l independent:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build buildVerifică că lanțul de instrumente este rezolvat compilând un program minimal împotriva anteturilor:
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc;
std::cout << "Linked OK - pages: " << doc.Pages().Count() << "\n";
}Un build reușit care afișează pages: 0 pentru Document proaspăt construit și gol confirmă că biblioteca este legată corect.
Pasul 2: Importă clasele necesare
#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>Pasul 3: Deschide un document PDF și numără paginile acestuia
Construiește un Document dintr-o cale de fișier pentru a deschide un PDF existent. Document::Pages() returnează PageCollection, iar Count() raportează câte pagini conține:
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Page count: " << doc.Pages().Count() << "\n";Pasul 4: Citește metadatele documentului
Document::Info() returnează un obiect DocumentInfo cu accesori tipizați de citire/scriere pentru intrările standard ale dicționarului /Info:
auto& info = doc.Info();
std::cout << "Title: " << info.Title() << "\n";
std::cout << "Author: " << info.Author() << "\n";
std::cout << "Producer: " << info.Producer() << "\n";Pasul 5: Extrage textul dintr-o pagină
Aspose::Pdf::Text::TextAbsorber parcurge un Document sau o singură Page și acumulează textul întâlnit; Text() returnează rezultatul ulterior. PageCollection este indexat de la 1, astfel că Pages()[1] este prima pagină:
auto page = doc.Pages()[1];
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(page);
std::cout << absorber.Text() << "\n";Visit() acceptă, de asemenea, întregul Document direct (absorber.Visit(doc)) când doriți ca textul fiecărei pagini să fie concatenat împreună în loc de o singură pagină.
Pasul 6: Redă pagina ca o imagine raster
BmpDevice redă un Page într-o imagine BMP necomprimată. Constructorul său primește un Resolution care controlează DPI-ul de ieșire și Process() scrie octeții redați către orice std::ostream:
Aspose::Pdf::Devices::BmpDevice device(Aspose::Pdf::Devices::Resolution(150));
std::ofstream imageOut("page1.bmp", std::ios::binary);
device.Process(page, imageOut);Pasul 7: Actualizează metadatele și salvează documentul
Setters on DocumentInfo marchează modificări care sunt aplicate data viitoare când Save() rulează pe Document deținător:
doc.Info().Title("Processed by Aspose.PDF FOSS for C++");
doc.Save("output.pdf");Probleme comune și soluții
Accessing Pages()[0] throws std::out_of_range
PageCollection este indexat de la 1, respectând semantica canonică Aspose.PDF — prima pagină este Pages()[1]. Un indice sub 1 sau peste Count() aruncă.
TextAbsorber::Text() returnează un șir gol
Text() returnează orice a fost acumulat de cea mai recentă apelare Visit(). Confirmați că Visit() a fost într-adevăr apelat înainte de a citi Text(), și că pagina sau documentul pe care l-ați vizitat conține text extrabil, nu doar imagini scanate.
Fișierul BMP redat este neașteptat de mic sau pare gol
O valoare mică a Resolution produce o imagine raster mică. Creșteți DPI-ul transmis către Resolution — de exemplu, Resolution(300) pentru ieșire de calitate tipărit — și confirmați că indicele paginii transmis către Process() este cel pe care l-ați intenționat.
DocumentInfo câmpurile sunt citite ca șiruri goale
Nu toți producătorii PDF scriu intrări standard /Info. Verificați Producer() și Creator() pentru valori goale înainte de a presupune că extragerea metadatelor a eșuat — un șir gol este rezultatul definit pentru o cheie absentă.
Modificări făcute cu Info().Title(...) nu apar în fișierul salvat
Modificările DocumentInfo sunt pregătite în memorie și sunt salvate doar data viitoare când Save() rulează pe aceeași instanță Document. Asigură-te că editarea metadatelor are loc înainte de Save(), nu după.
Întrebări frecvente
Indexarea paginilor este zero-bazată sau unu-bazată în Aspose.PDF FOSS pentru C++?
Începând de la unu. doc.Pages()[1] este întotdeauna prima pagină.
Poate TextAbsorber să extragă textul dintr-o singură pagină în loc de întregul document?
Da. Visit() este supraîncărcat pentru a accepta fie un Document — care extrage textul fiecărei pagini —, fie un singur Page, care extrage doar textul acelei pagini.
Trebuie să apelez Save() dacă doar citesc date din document?
Nu. Save() este necesar doar după modificări care trebuie scrise înapoi într-un fișier, cum ar fi editarea câmpurilor DocumentInfo. Citirea numărului de pagini, extragerea textului sau redarea unei pagini nu modifică documentul.
Cum controlez rezoluția unei pagini randate?
Transmite o valoare Resolution constructorului dispozitivului — de exemplu, Resolution(150) pentru 150 DPI. Valorile mai mari produc imagini raster mai mari și cu fidelitate mai ridicată.
Ce format produce BmpDevice?
O imagine BMP necomprimată scrisă direct în std::ostream transmisă către Process().