Wie man mit PDF-Dokumenten in C++ arbeitet
Aspose.PDF FOSS für C++ ist eine MIT-lizenzierte, abhängigkeitfreie C++20-Bibliothek, die mit CMake gebaut und gelinkt wird — es gibt keinen Paketmanager-Import zum Hinzufügen. Dieses Handbuch führt durch den Kern-Document-zentrierten Workflow: Öffnen einer bestehenden PDF, Inspektion ihrer Seiten und Metadaten, Extrahieren von Text und Rendern einer Seite zu einem Rasterbild.
Schritt-für-Schritt-Anleitung
Schritt 1: Paket installieren
Klone das Repository und füge es deinem CMake-Projekt als Unterverzeichnis hinzu:
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)Oder konfiguriere und baue es eigenständig:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build buildÜberprüfe, dass die Toolchain auflöst, indem du ein Minimalprogramm gegen die Header kompilierst:
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc;
std::cout << "Linked OK - pages: " << doc.Pages().Count() << "\n";
}Ein erfolgreicher Build, der pages: 0 für das frisch erstellte, leere Document ausgibt, bestätigt, dass die Bibliothek korrekt verlinkt ist.
Schritt 2: Erforderliche Klassen importieren
#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>Schritt 3: Öffnen Sie ein PDF-Dokument und zählen Sie seine Seiten
Erzeugen Sie ein Document aus einem Dateipfad, um ein vorhandenes PDF zu öffnen. Document::Pages() gibt das PageCollection zurück, und Count() meldet, wie viele Seiten es enthält:
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Page count: " << doc.Pages().Count() << "\n";Schritt 4: Dokument-Metadaten lesen
Document::Info() gibt ein DocumentInfo-Objekt mit typisierten Lese-/Schreibzugriffen für die standardmäßigen /Info-Dictionary-Einträge zurück:
auto& info = doc.Info();
std::cout << "Title: " << info.Title() << "\n";
std::cout << "Author: " << info.Author() << "\n";
std::cout << "Producer: " << info.Producer() << "\n";Schritt 5: Text von einer Seite extrahieren
Aspose::Pdf::Text::TextAbsorber durchläuft ein Document oder ein einzelnes Page und sammelt den dabei auftretenden Text; Text() gibt anschließend das Ergebnis zurück. PageCollection ist 1-basiert, sodass Pages()[1] die erste Seite ist:
auto page = doc.Pages()[1];
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(page);
std::cout << absorber.Text() << "\n";Visit() akzeptiert auch das gesamte Document direkt (absorber.Visit(doc)), wenn Sie den Text aller Seiten zusammengefügt haben möchten, anstatt einer einzelnen Seite.
Schritt 6: Seite in ein Rasterbild rendern
BmpDevice rendert ein Page in ein unkomprimiertes BMP-Bild. Sein Konstruktor nimmt ein Resolution, das die AusgabedPI steuert, und Process() schreibt die gerenderten Bytes in jede std::ostream:
Aspose::Pdf::Devices::BmpDevice device(Aspose::Pdf::Devices::Resolution(150));
std::ofstream imageOut("page1.bmp", std::ios::binary);
device.Process(page, imageOut);Schritt 7: Metadaten aktualisieren und Dokument speichern
Setter auf DocumentInfo planen Änderungen, die beim nächsten Ausführen von Save() auf dem zugehörigen Document geschrieben werden:
doc.Info().Title("Processed by Aspose.PDF FOSS for C++");
doc.Save("output.pdf");Häufige Probleme und Lösungen
Accessing Pages()[0] throws std::out_of_range
PageCollection ist 1-basiert und entspricht den kanonischen Aspose.PDF-Semantiken — die erste Seite ist Pages()[1]. Ein Index kleiner als 1 oder größer als Count() löst einen Fehler aus.
TextAbsorber::Text() gibt einen leeren String zurück
Text() gibt zurück, was durch den letzten Visit()-Aufruf angesammelt wurde. Bestätigen Sie, dass Visit() tatsächlich aufgerufen wurde, bevor Sie Text() lesen, und dass die Seite oder das Dokument, das Sie besucht haben, extrahierbaren Text enthält und nicht nur gescannte Bilder.
Die gerenderte BMP-Datei ist unerwartet klein oder sieht leer aus
Ein niedriger Resolution-Wert erzeugt ein kleines Rasterbild. Erhöhen Sie die an Resolution übergebene DPI — zum Beispiel Resolution(300) für Druckqualität — und prüfen Sie, ob der an Process() übergebene Seitenindex der von Ihnen beabsichtigte ist.
DocumentInfo Felder werden als leere Strings zurückgelesen
Nicht jeder PDF-Erzeuger schreibt standardmäßige /Info-Einträge. Prüfen Sie Producer() und Creator() auf leere Werte, bevor Sie annehmen, dass die Metadatenextraktion fehlgeschlagen ist — eine leere Zeichenkette ist das definierte Ergebnis für einen fehlenden Schlüssel.
Änderungen vorgenommen mit Info().Title(...) erscheinen nicht in der gespeicherten Datei
DocumentInfo-Mutationen werden im Speicher vorgemerkt und erst beim nächsten Durchlauf von Save() auf derselben Document-Instanz dauerhaft gespeichert. Stellen Sie sicher, dass die Metadatenbearbeitung vor Save() erfolgt, nicht danach.
Häufig gestellte Fragen
Ist die Seitennummerierung in Aspose.PDF FOSS für C++ nullbasiert oder einsbasiert?
Einsbasiert. doc.Pages()[1] ist immer die erste Seite.
Kann TextAbsorber Text von einer einzelnen Seite extrahieren statt vom gesamten Dokument?
Ja. Visit() ist überladen, um entweder ein Document zu akzeptieren — das den Text jeder Seite extrahiert — oder ein einzelnes Page, das nur den Text dieser Seite extrahiert.
Muss ich Save() aufrufen, wenn ich nur Daten aus dem Dokument lese?
Nein. Save() ist nur erforderlich nach Änderungen, die zurück in eine Datei geschrieben werden müssen, wie das Bearbeiten von DocumentInfo-Feldern. Das Lesen der Seitenzahl, das Extrahieren von Text oder das Rendern einer Seite verändert das Dokument nicht.
Wie kann ich die Auflösung einer gerenderten Seite steuern?
Übergeben Sie dem Konstruktor des Geräts einen Resolution-Wert — zum Beispiel Resolution(150) für 150 DPI. Höhere Werte erzeugen größere Rasterbilder mit höherer Detailtreue.
Welches Format erzeugt BmpDevice?
Ein unkomprimiertes BMP-Bild, das direkt in das std::ostream geschrieben wird, das an Process() übergeben wurde.