Einleitung
Dieses Handbuch zeigt, wie man den dokumentenbezogenen Zustand in Aspose.PDF FOSS für C++ liest und aktualisiert – die Teile einer PDF, die das Dokument selbst beschreiben und nicht das, was auf den Seiten gezeichnet wird. Aspose.PDF FOSS für C++ konzentriert sich auf die Klasse Aspose::Pdf::Document, die ein vorhandenes PDF von einem Dateipfad lädt und sowohl für die Inhaltsbearbeitung als auch für die dokumentenbezogene Buchführung bereitstellt. Die dokumentenbezogene Buchführung umfasst das /Info-Dictionary, den XMP-Metadaten-Stream, den Lesezeichen-(Outline-)Baum, der im Navigationsbereich eines Viewers angezeigt wird, benannte Ziele, die von internen Links verwendet werden, Dateianhänge, die in das PDF eingebettet sind, und die benutzerdefinierten Seiten-Nummerierungs-Sequenzen, die ein Dokument definieren kann.
Dieser Beitrag führt die API-Oberfläche für jeden dieser Bereiche durch: DocumentInfo für die klassischen Felder des /Info-Dictionaries (title, author, creator, subject, keywords), Metadata für den XMP-Metadaten-Stream, Outlines und OutlineItemCollection für den Lesezeichen-Baum, NamedDestinationCollection für benannte Links, EmbeddedFileCollection und FileSpecification für Anhänge sowie PageLabelCollection für die seitenbezogene Nummerierung nach Bereichen. Jeder Abschnitt kombiniert die jeweilige Klasse mit einem funktionierenden Beispiel, das aus einem geladenen Document-Objekt erstellt wurde.
Aspose.PDF FOSS für C++ wird unter der MIT-Lizenz veröffentlicht und bindet nur die C++-Standardbibliothek ein, sodass jede hier beschriebene Operation ohne proprietäre PDF-Engine oder Drittanbieter-Abhängigkeit ausgeführt wird. Die Bibliothek wird als statisches Ziel (aspose_pdf_foss) gebaut, das über CMake hinzugefügt wird.
Im Lieferumfang enthalten
Das /Info-Dictionary — DocumentInfo
Document.Info() gibt eine Referenz vom Typ DocumentInfo zurück, die an das /Info-Dictionary der PDF gebunden ist. Sie verfügt über typisierte Zugriffe für die Standardfelder — Title(), Author(), Creator(), Subject(), Keywords(), Producer() und Trapped() — jeweils mit einem passenden Setter, sowie ein generisches Add(key, value)/Remove(key)-Paar für benutzerdefinierte Schlüssel und IsPredefinedKey(key), um zu prüfen, ob ein Schlüsselname zu den Standardfeldern gehört. Document.SetTitle() ist eine Abkürzung, die den Titel direkt im Dokument schreibt.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/document_info.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& info = doc.Info();
std::cout << "Title: " << info.Title() << "\n";
std::cout << "Author: " << info.Author() << "\n";
info.Author("Demo author");
info.Creator("Aspose.PDF FOSS C++");
info.Add("Generated-By", "document-management sample");
doc.Save("output.pdf");
}
XMP-Metadaten — Metadata
Jenseits des /Info-Dictionaries liefert Document.Metadata() ein Metadata-Objekt über den XMP-Metadaten-Stream des Dokuments. Es verhält sich wie ein assoziativer Container von Einträgen: Add(key, value), Contains(key), ContainsKey(key), TryGetValue(key, value), Remove(key), Keys(), Values() und Count(). Benutzerdefinierte Namespaces werden mit RegisterNamespaceUri(prefix, namespaceUri) registriert und mit GetNamespaceUriByPrefix() bzw. GetPrefixByNamespaceUri() wieder zurückgelöst.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/metadata.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& metadata = doc.Metadata();
metadata.RegisterNamespaceUri("myapp", "http://example.com/myapp/1.0/");
metadata.Add("myapp:BatchId", "2026-07-run-42");
std::cout << "XMP entries: " << metadata.Count() << "\n";
doc.Save("output.pdf");
}
Lesezeichen und Gliederungen
Document.Outlines() gibt die OutlineCollection des Dokuments zurück — die Wurzel des Lesezeichenbaums, der im Navigationspanel eines Viewers angezeigt wird. Die Sammlung unterstützt Count(), Add(item), Clear(), Contains(item), Remove(item), Delete() sowie die Endpunkt-Accessor-Methoden First()/Last(), die OutlineItemCollection-Knoten zurückgeben. Jeder OutlineItemCollection-Knoten trägt ein Title(), Bold()/Italic()-Anzeige-Flag, einen Open()-Erweiterungszustand, ein Destination() oder Action() und Traversal-Member Next(), Prev(), HasNext(), Level() und Parent(), die zurück zur zugehörigen Outlines-Sammlung führen.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/outlines.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& outlines = doc.Outlines();
std::cout << "Top-level bookmarks: " << outlines.Count() << "\n";
if (outlines.Count() > 0) {
auto& first = outlines.First();
std::cout << "First bookmark: " << first.Title()
<< " (level " << first.Level() << ")\n";
}
}
Benannte Ziele
Document.NamedDestinations() gibt eine NamedDestinationCollection zurück, eine Lookup-Tabelle, die anwendungsdefinierte Namen zu Zielen im Dokument abbildet. Neue Einträge werden mit Add(name, appointment) registriert, wobei appointment eine IAppointment-Implementierung ist – dieselbe Schnittstelle, die für Outline-Item-Ziele und Link-Aktionen verwendet wird. Vorhandene Einträge werden mit Remove(name) entfernt, mit Count() gezählt und mit Names() aufgelistet.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/named_destination_collection.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& destinations = doc.NamedDestinations();
std::cout << "Named destinations: " << destinations.Count() << "\n";
for (const auto& name : destinations.Names()) {
std::cout << " " << name << "\n";
}
}
Eingebettete Dateien und Anhänge
Document.EmbeddedFiles() gibt eine EmbeddedFileCollection von FileSpecification-Anhängen zurück, die im PDF enthalten sind. Dateien werden mit Add(file) oder Add(key, file) hinzugefügt, über FindByName(name) gesucht, mit Delete(name), DeleteByKey(key) oder Delete() entfernt und über Count() und Keys() aufgelistet. Jede FileSpecification liefert ihr Name(), Description(), MIMEType() und AFRelationship() – die PDF-„Associated File“-Beziehungsklassifikation.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/file_specification.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& files = doc.EmbeddedFiles();
std::cout << "Embedded files: " << files.Count() << "\n";
for (const auto& key : files.Keys()) {
auto spec = files.FindByName(key);
std::cout << " " << spec.Name() << " (" << spec.MIMEType() << ")\n";
}
}
Seitenbeschriftungen
Document.PageLabels() gibt eine PageLabelCollection für die benutzerdefinierten Seitennummerierungs-Sequenzen zurück, die ein Viewer anstelle der physischen Seitennummern anzeigt – zum Beispiel römische Zahlen für ein Vorwort, gefolgt von arabischen Zahlen für den Hauptteil. GetLabel(pageIndex) ruft das für eine Seite geltende PageLabel ab; PageLabel stellt StartingValue(), NumberingStyle() (ein Aspose::Pdf::NumberingStyle-Wert wie NumeralsArabic oder NumeralsRomanLowercase) und Prefix() bereit. UpdateLabel(pageIndex, pageLabel) weist ab dieser Seite ein Label zu, RemoveLabel(pageIndex) löscht ein solches und GetPages() listet alle Seitenindizes auf, die ein benutzerdefiniertes Label besitzen.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/page_label.hpp>
#include <aspose/pdf/page_label_collection.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& labels = doc.PageLabels();
for (int pageIndex : labels.GetPages()) {
auto label = labels.GetLabel(pageIndex);
std::cout << "Page " << pageIndex << " prefix: " << label.Prefix()
<< ", starts at " << label.StartingValue() << "\n";
}
auto preface = labels.GetLabel(1);
preface.NumberingStyle(Aspose::Pdf::NumberingStyle::NumeralsRomanLowercase);
preface.StartingValue(1);
labels.UpdateLabel(1, preface);
doc.Save("output.pdf");
}
Schnellstart
Fügen Sie die Bibliothek als CMake-Unterverzeichnis hinzu und linken Sie gegen das Ziel aspose_pdf_foss:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)
Öffnen Sie ein Dokument, lesen und aktualisieren Sie dessen /Info-Metadaten und speichern Sie das Ergebnis:
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& info = doc.Info();
std::cout << "Title: " << info.Title() << "\n";
std::cout << "Author: " << info.Author() << "\n";
doc.SetTitle("Updated Report Title");
info.Author("Report Generator");
info.Add("Generated-By", "Aspose.PDF FOSS for C++");
doc.Save("output.pdf");
return 0;
}
Unterstützte Formate
| Format | Erweiterung | Lesen | Schreiben |
|---|---|---|---|
| BMP | .bmp | — | ✓ |
| JPEG | .jpg | — | ✓ |
| TIFF | .tiff | — | ✓ |
| Text | .txt | — | ✓ |
| SVG | .svg | ✓ | — |
BMP, JPEG und TIFF sind von ihren jeweiligen Geräteklassen erzeugte Seiten-Renderausgaben, und Text wird über TextAbsorber extrahiert. SVG wird als Vektorinhalt über den SVG-Ladepfad der Bibliothek importiert. Keine der oben behandelten Dokument-Verwaltungs-Typen sind Formatkonverter—sie lesen und schreiben ausschließlich die PDF-Struktur.
Open Source & Lizenzierung
Aspose.PDF FOSS für C++ wird unter der MIT-Lizenz vertrieben, wobei der vollständige Quellcode unter github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp verfügbar ist. Die Lizenz erlaubt kommerzielle Nutzung, Modifikation und Weiterverteilung ohne separate Vereinbarung.