Úvod
Tento průvodce ukazuje, jak číst a aktualizovat stav na úrovni dokumentu v Aspose.PDF FOSS pro C++ — části PDF, které popisují samotný dokument, nikoli to, co je vykresleno na jeho stránkách. Aspose.PDF FOSS pro C++ se soustředí na třídu Aspose::Pdf::Document, která načte existující PDF ze souborové cesty a zpřístupní jej jak pro úpravu obsahu, tak pro účetnictví na úrovni dokumentu. Účetnictví na úrovni dokumentu zahrnuje slovník /Info, XMP metadata stream, strom záložek (outline) zobrazený v navigačním panelu prohlížeče, pojmenované destinace používané interními odkazy, souborové přílohy vložené do PDF a vlastní sekvence číslování stránek, které může dokument definovat.
Tento příspěvek prochází rozhraní API pro každou z těchto oblastí: DocumentInfo pro klasické pole slovníku /Info (title, author, creator, subject, keywords), Metadata pro XMP metadata stream, Outlines a OutlineItemCollection pro strom záložek, NamedDestinationCollection pro pojmenované odkazy, EmbeddedFileCollection a FileSpecification pro přílohy a PageLabelCollection pro číslování stránek po rozsazích. Každá sekce spojuje příslušnou třídu s funkčním příkladem vytvořeným z načteného objektu Document.
Aspose.PDF FOSS pro C++ je vydáno pod licencí MIT a odkazuje pouze na standardní knihovnu C++, takže každá zde popsaná operace běží bez proprietárního PDF engine nebo externí závislosti. Knihovna se sestavuje jako statický cíl (aspose_pdf_foss) přidaný pomocí CMake.
Co je zahrnuto
Slovník /Info — DocumentInfo
Document.Info() vrací referenci typu DocumentInfo navázanou na slovník /Info PDF. Má typizované přístupy k standardním polím — Title(), Author(), Creator(), Subject(), Keywords(), Producer() a Trapped() — každé s odpovídajícím setterem, plus obecný pár Add(key, value) / Remove(key) pro vlastní klíče a IsPredefinedKey(key) pro kontrolu, zda je název klíče jedním ze standardních polí. Document.SetTitle() je zkratka, která zapíše název přímo do dokumentu.
#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");
}
Metadata XMP — Metadata
Mimo slovník /Info vrací Document.Metadata() objekt Metadata nad XMP proudem metadat dokumentu. Chová se jako asociativní kontejner položek: Add(key, value), Contains(key), ContainsKey(key), TryGetValue(key, value), Remove(key), Keys(), Values() a Count(). Vlastní jmenné prostory jsou registrovány pomocí RegisterNamespaceUri(prefix, namespaceUri) a vzájemně řešeny pomocí GetNamespaceUriByPrefix() a GetPrefixByNamespaceUri().
#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");
}
Záložky a osnovy
Document.Outlines() vrací OutlineCollection dokumentu — kořen stromu záložek zobrazeného v navigačním panelu prohlížeče. Kolekce podporuje Count(), Add(item), Clear(), Contains(item), Remove(item), Delete() a koncové přístupy First() / Last(), které vrací uzly OutlineItemCollection. Každý uzel OutlineItemCollection nese Title(), příznaky zobrazení Bold() / Italic(), stav rozbalení Open(), Destination() nebo Action(), a členy procházení Next(), Prev(), HasNext(), Level() a Parent() zpět k vlastní kolekci Outlines.
#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";
}
}
Pojmenované destinace
Document.NamedDestinations() vrací NamedDestinationCollection, vyhledávací tabulku mapující názvy definované aplikací na cíle uvnitř dokumentu. Nové položky se registrují pomocí Add(name, appointment), kde appointment je implementace IAppointment — stejného rozhraní používaného cíli položek osnovy a akcemi odkazů. Existující položky se odstraňují pomocí Remove(name), počítají se pomocí Count() a enumerují pomocí Names().
#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";
}
}
Vložené soubory a přílohy
Document.EmbeddedFiles() vrací EmbeddedFileCollection obsahující přílohy FileSpecification umístěné uvnitř PDF. Soubory se přidávají pomocí Add(file) nebo Add(key, file), vyhledávají se pomocí FindByName(name), odstraňují se pomocí Delete(name), DeleteByKey(key) nebo Delete(), a enumerují se pomocí Count() a Keys(). Každý FileSpecification uvádí své Name(), Description(), MIMEType() a AFRelationship() — klasifikaci vztahu PDF „Associated File“.
#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";
}
}
Číslování stránek
Document.PageLabels() vrací PageLabelCollection pro vlastní sekvence číslování stránek, které prohlížeč zobrazuje místo fyzických čísel stránek — například římské číslice pro předmluvu následované arabskými číslicemi pro hlavní část. GetLabel(pageIndex) získá PageLabel platný pro stránku; PageLabel nabízí StartingValue(), NumberingStyle() (hodnota Aspose::Pdf::NumberingStyle, např. NumeralsArabic nebo NumeralsRomanLowercase) a Prefix(). UpdateLabel(pageIndex, pageLabel) přiřadí štítek počínaje touto stránkou, RemoveLabel(pageIndex) jej odstraní a GetPages() vypíše všechny indexy stránek, které mají vlastní štítek.
#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");
}
Rychlý start
Přidejte knihovnu jako podadresář CMake a propojte ji s cílem aspose_pdf_foss:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)
Otevřete dokument, přečtěte a aktualizujte jeho metadata /Info a uložte výsledek:
#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;
}
Podporované formáty
| Formát | Rozšíření | Číst | Zapsat |
|---|---|---|---|
| BMP | .bmp | — | ✓ |
| JPEG | .jpg | — | ✓ |
| TIFF | .tiff | — | ✓ |
| Text | .txt | — | ✓ |
| SVG | .svg | ✓ | — |
BMP, JPEG a TIFF jsou výstupy pro vykreslování stránek generované jejich odpovídajícími třídami zařízení a text je získáván pomocí TextAbsorber. SVG se importuje jako vektorový obsah přes načítací cestu SVG knihovny. Žádný z výše uvedených typů správy dokumentů není konvertorem formátů — pouze čtou a zapisují strukturu PDF.
Open Source a licencování
Aspose.PDF FOSS pro C++ je distribuován pod licencí MIT, s plným zdrojovým kódem dostupným na github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp. Licence povoluje komerční použití, úpravy a redistribuci bez samostatné dohody.