Введение

Aspose.PDF FOSS for C++ — это новая открытая библиотека для работы с PDF‑документами из кода C++20. Она распространяется под лицензией MIT и не имеет runtime‑зависимостей, кроме стандартной библиотеки C++ — кодировщики BMP, JPEG и TIFF, растеризатор страниц и парсер PDF реализованы внутри, поэтому нет ссылки на коммерческий PDF‑движок, внешний кодек изображений или стороннюю криптографическую библиотеку.

Библиотека построена вокруг класса Aspose::Pdf::Document, который загружает PDF из пути к файлу и предоставляет его содержимое через Document.Pages(), PageCollection отдельных объектов Page. Отсюда API охватывает извлечение текста, растеризацию страниц, шифрование документа, аннотации и поля AcroForm — операции, необходимые для чтения, инспекции и модификации существующих PDF‑файлов или создания новых с нуля.

Этот релиз предназначен для разработчиков, которым требуется обработка PDF внутри C++‑кода без добавления коммерческой лицензии или цепочки сторонних зависимостей: конвейеры документооборота, сервисы извлечения содержимого, инструменты конвертации PDF в изображения и приложения, которым необходимо шифровать или считывать данные форм в рамках более крупного сборочного процесса.


Что включено

Загрузка документов и доступ к страницам

Открытие существующего PDF осуществляется одним вызовом конструктора. Document разбирает файл и предоставляет его страницы через Pages(), который возвращает PageCollection, поддерживающий индексацию с 1, Count() и методы Add()/Insert()/Delete() для перестройки порядка страниц.

#include <aspose/pdf/document.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc("input.pdf");
    std::cout << "Page count: " << doc.Pages().Count() << "\n";

    auto page = doc.Pages()[1];
    std::cout << "First page number: " << page.Number() << "\n";
}

Извлечение текста

Aspose::Pdf::Text::TextAbsorber проходит по Document или отдельной Page и собирает найденный текстовый контент. Вызовите Visit() с документом или страницей, затем получите результат через Text(). HasErrors() сообщает, встретил ли абсорбер контент, который он не смог обработать.

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc("input.pdf");

    Aspose::Pdf::Text::TextAbsorber absorber;
    absorber.Visit(doc);
    std::cout << absorber.Text() << "\n";

    if (absorber.HasErrors()) {
        std::cerr << "Some content could not be extracted\n";
    }
}

Рендеринг в растровые изображения

Страницы рендерятся в BMP, JPEG или TIFF с помощью классов BmpDevice, JpegDevice и TiffDevice. Каждый девайс создаётся с параметром Resolution и предоставляет метод Process(page, output), который записывает отрисованное изображение в выходной поток.

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>

int main() {
    Aspose::Pdf::Document doc("input.pdf");

    Aspose::Pdf::Devices::BmpDevice bmp(Aspose::Pdf::Devices::Resolution(150));
    std::ofstream out("page1.bmp", std::ios::binary);
    bmp.Process(doc.Pages()[1], out);
}

Шифрование

Document.Encrypt() защищает документ паролем пользователя, паролем владельца, значением разрешений и выбором CryptoAlgorithm. Перечисление включает RC4-40 (RC4x40), RC4-128 (RC4x128), AES-128 (AESx128) и AES-256 (AESx256). Document.Decrypt() отменяет эту операцию, а IsEncrypted() сообщает, зашифрован ли документ в данный момент.

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

Аннотации

Каждая Page предоставляет AnnotationCollection через Annotations(). TextAnnotation создаётся в контексте принадлежащего документа, позиционируется с помощью Rectangle и добавляется в коллекцию страницы методом Add().

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/text_annotation.hpp>
#include <aspose/pdf/rectangle.hpp>

int main() {
    Aspose::Pdf::Document doc("input.pdf");

    Aspose::Pdf::Annotations::TextAnnotation note(doc);
    note.Rect(Aspose::Pdf::Rectangle(100.0, 700.0, 200.0, 720.0, false));
    note.Contents("Reviewed - see section 2");

    doc.Pages()[1].Annotations().Add(note);
    doc.Save("annotated.pdf");
}

Поля AcroForm

Document.Form() возвращает Form документа, который предоставляет существующие поля через Fields() как std::vector<Field*>. Каждый Field сообщает своё имя и текущее значение через PartialName() и Value(), а Form.Flatten() фиксирует внешний вид каждого поля в содержимом страницы, устраняя интерактивность.

#include <aspose/pdf/document.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc("form.pdf");
    auto& form = doc.Form();

    std::cout << "Field count: " << form.Count() << "\n";
    for (auto* field : form.Fields()) {
        std::cout << field->PartialName() << " = " << field->Value() << "\n";
    }

    form.Flatten();
    doc.Save("flattened.pdf");
}

Быстрый старт

Добавьте библиотеку как поддиректорию CMake и свяжите её с целью aspose_pdf_foss:

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

Откройте документ, выведите количество его страниц, извлеките текст и отрендерите первую страницу в BMP‑файл:

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc("input.pdf");
    std::cout << "Pages: " << doc.Pages().Count() << "\n";

    Aspose::Pdf::Text::TextAbsorber absorber;
    absorber.Visit(doc);
    std::cout << absorber.Text() << "\n";

    Aspose::Pdf::Devices::BmpDevice bmp(Aspose::Pdf::Devices::Resolution(150));
    std::ofstream out("page1.bmp", std::ios::binary);
    bmp.Process(doc.Pages()[1], out);
}

Поддерживаемые форматы

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

BMP, JPEG и TIFF — это выводы рендеринга страниц, создаваемые их соответствующими классами устройств. Текст извлекается из PDF с помощью TextAbsorber. SVG импортируется как векторный контент через путь загрузки SVG библиотеки.


Открытый исходный код и лицензирование

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


Начало работы

Связанные ресурсы