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 /InfoDocumentInfo

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

FormatRozszerzenieCzytajZapisz
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.


Rozpoczęcie

Powiązane zasoby