Введение
Это руководство показывает, как читать и обновлять состояние уровня документа в 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.
Aspose.PDF FOSS для C++ распространяется под лицензией MIT и связывается только со стандартной библиотекой C++, поэтому все описанные здесь операции выполняются без проприетарного PDF-движка или сторонних зависимостей. Библиотека собирается как статическая цель (aspose_pdf_foss), добавляемая через CMake.
Что включено
Словарь /Info — DocumentInfo
Document.Info() возвращает ссылку на DocumentInfo, привязанную к словарю /Info PDF. Он имеет типизированные аксессоры для стандартных полей — 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. Лицензия разрешает коммерческое использование, модификацию и распространение без отдельного соглашения.