Aspose.PDF FOSS for C++ Возможности
Aspose.PDF FOSS для C++: возможности
Aspose.PDF FOSS for C++ — это библиотека C++20 для создания, открытия, изменения и сохранения PDF-документов. На этой странице рассматриваются основные области возможностей и классы, которые служат их точками входа. Каждая область подробно описана на отдельной странице руководства разработчика.
Управление документами
Aspose::Pdf::Document является корневым объектом для каждой операции. Он открывает существующий файл по пути, предоставляет коллекцию страниц через Pages() и сохраняет изменения с помощью Save(). Optimize() и OptimizeResources() уменьшают размер файла, удаляя неиспользуемые или дублированные ресурсы.
#include <aspose/pdf/document.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& pages = doc.Pages();
pages.Add(); // append a blank page
pages.Delete(1); // remove the original first page
doc.Optimize();
doc.Save("output.pdf");
}Извлечение текста
Aspose::Pdf::Text::TextAbsorber проходит по документу или отдельной странице и собирает простой текст, который можно получить с помощью Text() после вызова Visit(). TextFragmentAbsorber выполняет тот же обход, но возвращает отдельные объекты TextFragment через TextFragments(), предоставляя доступ к позиции каждого фрагмента и его текстовому состоянию.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("report.pdf");
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(doc);
std::cout << absorber.Text() << "\n";
}Рендеринг в растровые изображения
Устройства рендеринга страниц преобразуют Page в растровое изображение. BmpDevice, PngDevice, JpegDevice и TiffDevice имеют одну и ту же подпись Process(page, output) и построены с помощью Resolution, который задает выходное DPI.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
int main() {
Aspose::Pdf::Document doc("report.pdf");
Aspose::Pdf::Devices::BmpDevice device(Aspose::Pdf::Devices::Resolution(150));
std::ofstream out("page1.bmp", std::ios::binary);
device.Process(doc.Pages()[1], out);
}Шифрование
Document::Encrypt() защищает документ пользовательским паролем (необходимым для его открытия) и паролем владельца (необходимым для изменения прав), используя алгоритм, выбранный из перечисления CryptoAlgorithm: RC4x40, RC4x128, AESx128 или AESx256. IsEncrypted() сообщает текущее состояние, а Decrypt() снимает защиту с уже открытого документа.
#include <aspose/pdf/document.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
doc.Encrypt("user-password", "owner-password",
Aspose::Pdf::Permissions::PrintDocument,
Aspose::Pdf::CryptoAlgorithm::AESx256);
doc.Save("encrypted.pdf");
}Аннотации
Аннотации прикрепляют видимые заметки, фигуры и разметку к странице. Каждый тип аннотации наследуется от Annotation и создаётся с целевым Page и размещением Rectangle, после чего добавляется на страницу через Annotations() (это AnnotationCollection).
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_annotation.hpp>
#include <aspose/pdf/rectangle.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto page = doc.Pages()[1];
Aspose::Pdf::Annotations::TextAnnotation note(
page, Aspose::Pdf::Rectangle(50.0, 700.0, 250.0, 740.0, false));
note.Contents("Reviewed and approved.");
page.Annotations().Add(note);
doc.Save("annotated.pdf");
}Forms
Поля AcroForm управляются через Aspose::Pdf::Forms::Form, доступные через Document::Form(). Типы полей, такие как TextBoxField, создаются как аннотации — с Page и Rectangle — и регистрируются в Form::Add().
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_box_field.hpp>
#include <aspose/pdf/rectangle.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto page = doc.Pages()[1];
Aspose::Pdf::Forms::TextBoxField field(
page, Aspose::Pdf::Rectangle(100.0, 650.0, 300.0, 670.0, false));
field.PartialName("customer_name");
field.Value("Jane Doe");
doc.Form().Add(field);
doc.Save("form_filled.pdf");
}Советы и лучшие практики
- Откройте входные файлы по пути с помощью конструктора
Document; вызовитеSave()с явным путем вывода, а не перезаписывая источник, пока другие дескрипторы к нему могут оставаться открытыми. - Вызовите
Optimize()передSave(), когда документ был сильно отредактирован — это удаляет ресурсы, которые больше не используются ни одной страницей. - Создавайте растровые устройства (
BmpDevice,PngDevice,JpegDevice,TiffDevice) один раз на разрешение и переиспользуйте их на разных страницах вместо создания устройства для каждой страницы. - Установите как пользовательский пароль, так и пароль владельца при вызове
Encrypt()— пустой пользовательский пароль позволяет любому просмотрщику открыть файл, тогда как пароль владельца контролирует изменения прав. - Держите объекты аннотаций и полей (
TextAnnotation,TextBoxFieldи аналогичные) живыми до тех пор, пока не вернётсяSave(), поскольку документ хранит ссылки на содержание страницы, к которой они были добавлены.
Распространённые проблемы
| Проблема | Причина | Исправление |
|---|---|---|
Save() создает файл с неизменённым содержимым | Изменения были внесены в копию страницы или аннотации, а не в объект, полученный из doc.Pages() | Изменяйте объект, возвращаемый напрямую Pages(), Annotations() или Form() |
| Отрисованное изображение пустое или белое | Передан неверный индекс страницы в Process() | PageCollection нумеруется с 1 — страница 1 это doc.Pages()[1], а не [0] |
Encrypt() создает файл, который всё равно открывается без пароля | Пароль пользователя оставлен пустым | Передайте непустую строку в качестве аргумента userPassword |
| Извлечённый текст пуст для отсканированного PDF | Страница содержит только растровое изображение, а не текстовые операторы | TextAbsorber читает текстовые операторы; страницы, содержащие только изображения, их не имеют для извлечения |
Поле, добавленное с помощью Form::Add(), не отображается на странице | Поле Rectangle выходит за пределы MediaBox страницы | Убедитесь, что координаты прямоугольника находятся в пределах границ Page::MediaBox() |
FAQ
Зависит ли Aspose.PDF FOSS для C++ от какой-либо коммерческой PDF-библиотеки?
Нет. Это реализация с нуля на C++20 без зависимости от какого-либо коммерческого PDF-стека, выпущенная под лицензией MIT.
Могу ли я создать новый PDF с нуля вместо открытия существующего?
Да. Document имеет конструктор по умолчанию, который создаёт пустой документ; вызовите Pages().Add(), чтобы добавить страницы перед сохранением.
В какие растровые форматы я могу рендерить?
BmpDevice, PngDevice, JpegDevice и TiffDevice рендерят отдельные страницы в BMP, PNG, JPEG и TIFF соответственно.
Какие алгоритмы шифрования поддерживаются?
CryptoAlgorithm предлагает RC4x40, RC4x128, AESx128 и AESx256, передаваемые в Document::Encrypt().
Куда мне идти дальше?
Руководство разработчика включает отдельные страницы для управления документами и страницами, PDF-native графикой и фигурами, аннотациями и интерактивными формами, а также более высокоуровневыми facade-классами, которые оборачивают общие файловые операции.
API Reference Сводка
| Класс/Метод | Описание: |
|---|---|
Document | Корневой объект — открывать, создавать, сохранять и оптимизировать PDF |
Document.Pages() | Возвращает PageCollection документа |
Document.Encrypt() / Decrypt() | Защитить документ паролем или снять защиту с документа |
Document.Form() | Возвращает контейнер AcroForm документа |
TextAbsorber | Извлекает неформатированный текст из документа или страницы |
TextFragmentAbsorber | Извлекает позиционированные фрагменты текста |
BmpDevice / PngDevice / JpegDevice / TiffDevice | Отрисовывает страницу в растровый формат изображения |
Resolution | Вывод DPI, передаваемый устройству рендеринга |
CryptoAlgorithm | Выбор алгоритма шифрования: RC4 или AES, 40–256 бит |
Permissions | Флаги контроля доступа, передаваемые в Encrypt() |
Annotation / AnnotationCollection | Базовый тип и контейнер для аннотаций страницы |
TextAnnotation | Текстовая аннотация заметки |
Form | AcroForm контейнер поля доступен через Document.Form() |
TextBoxField | Текстовое поле формы (однострочное/многострочное) |