Comment travailler avec des documents PDF en C++

Comment travailler avec des documents PDF en C++

Aspose.PDF FOSS pour C++ est une bibliothèque C++20 sous licence MIT, sans dépendances, construite et liée avec CMake — il n’y a aucune importation via un gestionnaire de paquets à ajouter. Ce guide parcourt le flux de travail centré sur Document : ouvrir un PDF existant, inspecter ses pages et ses métadonnées, extraire le texte et rendre une page en image raster.

Guide étape par étape

Étape 1: installer le paquet

Clonez le dépôt et ajoutez-le à votre projet CMake en tant que sous-répertoire:

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)

Ou configurez-le et compilez-le en autonome:

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

Vérifiez que la chaîne d’outils se résout en compilant un programme minimal contre les en-têtes:

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

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

Une compilation réussie qui affiche pages: 0 pour le Document fraîchement construit et vide confirme que la bibliothèque est correctement liée.


Étape 2: Importer les classes requises

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

Étape 3: Ouvrir un document PDF et compter ses pages

Construisez un Document à partir d’un chemin de fichier pour ouvrir un PDF existant. Document::Pages() renvoie le PageCollection, et Count() indique le nombre de pages qu’il contient:

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

Étape 4: Lire les métadonnées du document

Document::Info() renvoie un objet DocumentInfo avec des accesseurs de lecture/écriture typés pour les entrées standard du dictionnaire /Info:

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

Étape 5: Extraire le texte d’une page

Aspose::Pdf::Text::TextAbsorber parcourt un Document ou un seul Page et accumule le texte qu’il rencontre; Text() renvoie le résultat ensuite. PageCollection est indexé à partir de 1, donc Pages()[1] est la première page:

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

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

Visit() accepte également le Document complet directement (absorber.Visit(doc)) lorsque vous souhaitez que le texte de chaque page soit concaténé ensemble au lieu d’une seule page.


Étape 6: Rendu de la page en image raster

BmpDevice rend un Page en image BMP non compressée. Son constructeur accepte un Resolution qui contrôle le DPI de sortie, et Process() écrit les octets rendus vers n’importe quel std::ostream:

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

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

Étape 7: Mettre à jour les métadonnées et enregistrer le document

Les setters sur DocumentInfo préparent les modifications qui sont appliquées la prochaine fois que Save() s’exécute sur le Document propriétaire:

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

Problèmes courants et solutions

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

PageCollection est indexé à partir de 1, correspondant à la sémantique canonique de Aspose.PDF — la première page est Pages()[1]. Un indice inférieur à 1 ou supérieur à Count() génère une exception.

TextAbsorber::Text() renvoie une chaîne vide

Text() renvoie ce qui a été accumulé lors du dernier appel Visit(). Vérifiez que Visit() a réellement été appelé avant de lire Text(), et que la page ou le document que vous avez consulté contient du texte exploitable plutôt que seulement des images numérisées.

Le fichier BMP rendu est étonnamment petit ou apparaît vide

Une faible valeur Resolution produit une petite image raster. Augmentez le DPI transmis à Resolution — par exemple, Resolution(300) pour une sortie de qualité impression — et confirmez que l’indice de page transmis à Process() est celui que vous souhaitiez.

DocumentInfo les champs sont relus comme des chaînes vides

Tous les producteurs de PDF n’écrivent pas les entrées standard /Info. Vérifiez Producer() et Creator() pour des valeurs vides avant de supposer que l’extraction des métadonnées a échoué — une chaîne vide est le résultat défini pour une clé absente.

Modifications effectuées avec Info().Title(...) n’apparaissent pas dans le fichier enregistré

Les mutations DocumentInfo sont mises en mémoire tampon et ne sont persistées qu’à la prochaine exécution de Save() sur la même instance Document. Assurez-vous que la modification des métadonnées se produit avant Save(), pas après.

Foire aux questions

L’indexation des pages est-elle à base zéro ou à base un dans Aspose.PDF FOSS pour C++?

À base un. doc.Pages()[1] est toujours la première page.

Le TextAbsorber peut-il extraire le texte d’une seule page au lieu du document entier?

Oui. Visit() est surchargé pour accepter soit un Document — qui extrait le texte de chaque page —, soit un seul Page, qui extrait uniquement le texte de cette page.

Dois-je appeler Save() si je ne fais que lire les données du document?

Non. Save() n’est requis qu’après des modifications qui doivent être réécrites dans un fichier, comme la modification des champs DocumentInfo. Lire le nombre de pages, extraire du texte ou rendre une page ne modifie pas le document.

Comment puis-je contrôler la résolution d’une page rendue?

Passez une valeur Resolution au constructeur de l’appareil — par exemple, Resolution(150) pour 150 DPI. Des valeurs plus élevées produisent des images raster plus grandes et de meilleure fidélité.

Quel format BmpDevice produit-il?

Une image BMP non compressée écrite directement dans le std::ostream transmis à Process().

Voir aussi

 Français