Wstęp
Ten przewodnik pokazuje, jak odczytywać i aktualizować stan na poziomie dokumentu w Aspose.PDF FOSS dla C++ — części PDF opisujące sam dokument, a nie to, co jest rysowane na jego stronach. Aspose.PDF FOSS dla C++ koncentruje się na klasie Aspose::Pdf::Document, która wczytuje istniejący PDF ze ścieżki pliku i udostępnia go zarówno do edycji treści, jak i księgowości na poziomie dokumentu. Księgowość na poziomie dokumentu obejmuje słownik /Info, strumień metadanych XMP, drzewo zakładek (outline) wyświetlane w panelu nawigacyjnym przeglądarki, nazwane destynacje używane przez linki wewnętrzne, załączniki plików osadzone w PDF oraz niestandardowe sekwencje numeracji stron, które dokument może definiować.
Ten post przechodzi przez powierzchnię API dla każdej z tych dziedzin: DocumentInfo dla klasycznych pól słownika /Info (title, author, creator, subject, keywords), Metadata dla strumienia metadanych XMP, Outlines i OutlineItemCollection dla drzewa zakładek, NamedDestinationCollection dla nazwanych odnośników, EmbeddedFileCollection i FileSpecification dla załączników oraz PageLabelCollection dla numeracji stron w poszczególnych zakresach. Każda sekcja łączy odpowiednią klasę z działającym przykładem zbudowanym na podstawie załadowanego obiektu Document object.
Aspose.PDF FOSS dla C++ jest udostępniany na licencji MIT i linkuje tylko z biblioteką standardową C++, więc każda operacja opisana tutaj działa bez własnego silnika PDF ani zależności zewnętrznych. Biblioteka jest budowana jako statyczny target (aspose_pdf_foss) dodany przez CMake.
Co jest w zestawie
Słownik /Info — DocumentInfo
Document.Info() zwraca referencję DocumentInfo powiązaną ze słownikiem PDF /Info. Udostępnia typowane akcesory dla standardowych pól — Title(), Author(), Creator(), Subject(), Keywords(), Producer() i Trapped() — każdy z odpowiadającym setterem, a także ogólne pary Add(key, value) / Remove(key) dla własnych kluczy oraz IsPredefinedKey(key) pozwalający sprawdzić, czy nazwa klucza jest jednym ze standardowych pól. Document.SetTitle() jest skrótem, który zapisuje tytuł bezpośrednio w dokumencie.
#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");
}
Metadane XMP — Metadata
Poza słownikiem /Info, Document.Metadata() zwraca obiekt Metadata reprezentujący strumień metadanych XMP dokumentu. Działa jak asocjacyjny kontener wpisów: Add(key, value), Contains(key), ContainsKey(key), TryGetValue(key, value), Remove(key), Keys(), Values() oraz Count(). Własne przestrzenie nazw rejestruje się za pomocą RegisterNamespaceUri(prefix, namespaceUri), a ich rozwiązywanie w obie strony odbywa się przy użyciu GetNamespaceUriByPrefix() i 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");
}
Zakładki i Konspekty
Document.Outlines() zwraca OutlineCollection dokumentu — korzeń drzewa zakładek wyświetlanego w panelu nawigacji przeglądarki. Kolekcja obsługuje Count(), Add(item), Clear(), Contains(item), Remove(item), Delete() oraz akcesory końcowe First() / Last(), które zwracają węzły OutlineItemCollection. Każdy węzeł OutlineItemCollection posiada Title(), flagi wyświetlania Bold() / Italic(), stan rozwinięcia Open(), Destination() lub Action(), oraz elementy nawigacyjne Next(), Prev(), HasNext(), Level() i Parent() prowadzące z powrotem do kolekcji Outlines, do której należy.
#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";
}
}
Nazwane Cele
Document.NamedDestinations() zwraca NamedDestinationCollection, tabelę mapującą nazwy zdefiniowane przez aplikację na destynacje wewnątrz dokumentu. Nowe pozycje rejestruje się za pomocą Add(name, appointment), gdzie appointment jest implementacją IAppointment — tego samego interfejsu używanego przez destynacje elementów konspektu i akcje linków. Istniejące pozycje usuwa się za pomocą Remove(name), liczy się je przy pomocy Count(), a wylicza przy użyciu 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";
}
}
Pliki osadzone i załączniki
Document.EmbeddedFiles() zwraca EmbeddedFileCollection zawierającą załączniki FileSpecification osadzone w pliku PDF. Pliki dodaje się przy pomocy Add(file) lub Add(key, file), wyszukuje przez FindByName(name), usuwa przy pomocy Delete(name), DeleteByKey(key) lub Delete(), a wylicza poprzez Count() i Keys(). Każdy FileSpecification udostępnia Name(), Description(), MIMEType() oraz AFRelationship() — klasyfikację powiązania „Associated File” w PDF.
#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";
}
}
Etykiety stron
Document.PageLabels() zwraca PageLabelCollection dla niestandardowych sekwencji numeracji stron, które przeglądarka wyświetla zamiast fizycznych numerów stron — np. liczby rzymskie w przedmowie, a arabskie w treści. GetLabel(pageIndex) pobiera PageLabel obowiązujący dla danej strony; PageLabel udostępnia StartingValue(), NumberingStyle() (wartość Aspose::Pdf::NumberingStyle taką jak NumeralsArabic lub NumeralsRomanLowercase) oraz Prefix(). UpdateLabel(pageIndex, pageLabel) przypisuje etykietę zaczynającą się od tej strony, RemoveLabel(pageIndex) usuwa ją, a GetPages() wymienia wszystkie indeksy stron, które mają niestandardową etykietę.
#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");
}
Szybki start
Dodaj bibliotekę jako podkatalog CMake i połącz ją z celem aspose_pdf_foss.
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)
Otwórz dokument, odczytaj i zaktualizuj jego metadane /Info, a następnie zapisz wynik.
#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;
}
Obsługiwane formaty
| Format | Rozszerzenie | Czytaj | Zapisz |
|---|---|---|---|
| BMP | .bmp | — | ✓ |
| JPEG | .jpg | — | ✓ |
| TIFF | .tiff | — | ✓ |
| Text | .txt | — | ✓ |
| SVG | .svg | ✓ | — |
BMP, JPEG i TIFF są wyjściami renderującymi strony generowanymi przez ich odpowiednie klasy urządzeń, a tekst jest wydobywany za pomocą TextAbsorber. SVG jest importowane jako zawartość wektorowa poprzez ścieżkę ładowania SVG biblioteki. Żadne z wymienionych powyżej typów zarządzania dokumentami nie są konwerterami formatów — odczytują i zapisują wyłącznie strukturę PDF.
Open Source i licencjonowanie
Aspose.PDF FOSS dla C++ jest dystrybuowany na licencji MIT, a pełne źródło dostępne jest pod adresem github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp. Licencja zezwala na komercyjne użycie, modyfikację i redystrybucję bez osobnej umowy.