Вступ

У цьому посібнику показано, як читати та оновлювати стан на рівні документа в Aspose.PDF FOSS для C++ — частини PDF, які описують сам документ, а не те, що намальовано на його сторінках. Aspose.PDF FOSS для C++ зосереджений навколо класу Aspose::Pdf::Document, який завантажує існуючий PDF з файлового шляху та надає його для редагування вмісту та ведення обліку на рівні документа. Ведення обліку на рівні документа охоплює словник /Info, потік метаданих XMP, дерево закладок (контурів), що показується у навігаційній панелі переглядача, іменовані призначення, що використовуються внутрішніми посиланнями, вбудовані у PDF файлові вкладення та користувацькі послідовності нумерації сторінок, які документ може визначати.

У цьому дописі розглядається поверхня API для кожної з цих областей: DocumentInfo для класичних полів словника /Info (title, author, creator, subject, keywords), Metadata для потоку XMP-метаданих, Outlines та OutlineItemCollection для дерева закладок, NamedDestinationCollection для іменованих посилань, EmbeddedFileCollection і FileSpecification для вкладень та PageLabelCollection для нумерації сторінок у діапазонах. Кожен розділ поєднує відповідний клас з робочим прикладом, створеним з завантаженого об’єкта Document object.

Aspose.PDF FOSS для C++ випускається під ліцензією MIT і прив’язується лише до стандартної бібліотеки C++, тому кожна операція, описана тут, виконується без пропрієтарного PDF-двигуна чи сторонніх залежностей. Бібліотека збирається як статична ціль (aspose_pdf_foss) додана через CMake.


Що включено

Словник /InfoDocumentInfo

Document.Info() повертає посилання типу DocumentInfo, прив’язане до словника PDF /Info. Воно має типізовані аксесори для стандартних полів — Title(), Author(), Creator(), Subject(), Keywords(), Producer() і Trapped() — кожен з відповідним сеттером, а також загальну пару Add(key, value) / Remove(key) для користувацьких ключів і IsPredefinedKey(key), що перевіряє, чи є назва ключа однією зі стандартних. Document.SetTitle() — це скорочення, яке записує заголовок безпосередньо в документ.

#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-метадані — Metadata

Поза словником /Info, Document.Metadata() повертає об’єкт Metadata, що працює з XMP-потоком метаданих документа. Він поводиться як асоціативний контейнер записів: Add(key, value), Contains(key), ContainsKey(key), TryGetValue(key, value), Remove(key), Keys(), Values() та Count(). Користувацькі простори імен реєструються за допомогою RegisterNamespaceUri(prefix, namespaceUri) і можуть бути отримані у зворотному порядку за допомогою GetNamespaceUriByPrefix() та 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");
}

Закладки та контури

Document.Outlines() повертає OutlineCollection документа — корінь дерева закладок, що відображається у навігаційній панелі переглядача. Колекція підтримує Count(), Add(item), Clear(), Contains(item), Remove(item), Delete(), а також доступники кінцевих елементів First() / Last(), які повертають вузли OutlineItemCollection. Кожен вузол OutlineItemCollection містить Title(), прапорці відображення Bold() / Italic(), стан розгортання Open(), Destination() або Action(), та члени обходу Next(), Prev(), HasNext(), Level() і Parent(), що повертаються до колекції-власника 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";
    }
}

Іменовані призначення

Document.NamedDestinations() повертає NamedDestinationCollection — таблицю пошуку, що відображає імена, визначені додатком, у призначення всередині документа. Нові записи реєструються за допомогою Add(name, appointment), де appointment — реалізація інтерфейсу IAppointment, того самого інтерфейсу, що використовується для призначень елементів структури та дій посилань. Існуючі записи видаляються за допомогою Remove(name), підраховуються за допомогою Count() і перераховуються за допомогою 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";
    }
}

Вбудовані файли та вкладення

Document.EmbeddedFiles() повертає EmbeddedFileCollection вкладень FileSpecification, що містяться у PDF. Файли додаються за допомогою Add(file) або Add(key, file), шукаються за FindByName(name), видаляються за допомогою Delete(name), DeleteByKey(key) або Delete(), і перераховуються через Count() і Keys(). Кожен FileSpecification повертає свої Name(), Description(), MIMEType() та AFRelationship() — класифікацію відношення 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";
    }
}

Мітки сторінок

Document.PageLabels() повертає PageLabelCollection для користувацьких послідовностей нумерації сторінок, які переглядач відображає замість фізичних номерів — наприклад, римські цифри для передмови та арабські цифри для основного тексту. GetLabel(pageIndex) отримує PageLabel, що діє для сторінки; PageLabel надає StartingValue(), NumberingStyle() (значення Aspose::Pdf::NumberingStyle, таке як NumeralsArabic або NumeralsRomanLowercase) та Prefix(). UpdateLabel(pageIndex, pageLabel) призначає мітку, починаючи з цієї сторінки, RemoveLabel(pageIndex) видаляє її, а GetPages() перераховує всі індекси сторінок, що мають користувацьку мітку.

#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");
}

Швидкий старт

Додайте бібліотеку як підкаталог CMake і прив’яжіть її до цілі aspose_pdf_foss:

add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)

Відкрийте документ, прочитайте та оновіть його метадані /Info, і збережіть результат:

#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;
}

Підтримувані формати

ФорматРозширенняЧитатиЗапис
BMP.bmp
JPEG.jpg
TIFF.tiff
Text.txt
SVG.svg

BMP, JPEG і TIFF — це результати відображення сторінок, створені їхніми відповідними класами пристроїв, а текст витягується за допомогою TextAbsorber. SVG імпортується як векторний вміст через шлях завантаження SVG бібліотеки. Жоден із вищезгаданих типів управління документами не є конвертерами форматів — вони лише читають і записують структуру PDF.


Відкритий код та ліцензування

Aspose.PDF FOSS для C++ розповсюджується під ліцензією MIT, повний вихідний код доступний за адресою github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp. Ліцензія дозволяє комерційне використання, модифікацію та розповсюдження без окремої угоди.


Початок роботи

Пов’язані ресурси