Вступ
У цьому посібнику показано, як читати та оновлювати стан на рівні документа в 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.
Що включено
Словник /Info — DocumentInfo
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. Ліцензія дозволяє комерційне використання, модифікацію та розповсюдження без окремої угоди.