Введение

Aspose.PDF FOSS for C++ — это open-source библиотека C++20 для работы с PDF-документами. Поверхность API охватывает управление документами и страницами, извлечение текста, растерную отрисовку, шифрование, аннотации и интерактивные поля AcroForm — операции, которые чаще всего требуются, когда C++-приложению нужно создавать, просматривать или преобразовывать PDF-файлы без зависимости от внешнего PDF-движка или коммерческого SDK.

Библиотека связывается только со стандартной библиотекой C++. Внутренние компоненты, такие как растровые кодировщики BMP, JPEG и TIFF, а также растеризатор страниц, реализованы с нуля внутри проекта, поэтому нет зависимости от системного PDF-рендерера, коммерческого PDF-компонента или любого стороннего кодека изображений. Это сохраняет размер зависимостей на нуле, кроме компилятора, соответствующего C++20, и стандартной библиотеки.

Aspose.PDF FOSS for C++ выпускается под лицензией MIT. В этом посте рассматриваются основные области возможностей, предоставляемые классом Document и его вспомогательными типами, а также пример быстрого старта и текущая подтверждённая поддержка форматов.


Ключевые возможности

Управление документами и страницами

Класс Document является точкой входа для открытия, просмотра и сохранения PDF-файлов. Страницы доступны через Document.Pages(), который возвращает PageCollection, поддерживающий Count(), Add(), Insert(pageNumber) и Delete(pageNumber). Метаданные уровня документа читаются и обновляются через Document.Info() (экземпляр DocumentInfo) или задаются напрямую с помощью Document.SetTitle().

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

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

    // Insert a blank page after page 1, then drop the last page
    doc.Pages().Insert(2);
    doc.Pages().Delete(doc.Pages().Count());

    doc.SetTitle("Generated Report");
    doc.Save("output.pdf");
}

Document.Optimize() и Document.OptimizeResources() уменьшают размер выходного файла, объединяя и удаляя неиспользуемые ресурсы перед сохранением.

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

Aspose::Pdf::Text::TextAbsorber извлекает чистый текстовый контент всего документа или отдельной страницы. Visit() проходит по цели, а Text() возвращает накопленную строку. TextFragmentAbsorber работает на более тонком уровне, раскрывая отдельные текстовые фрагменты через TextFragmentCollection.

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

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

    // Extract all text from the document
    Aspose::Pdf::Text::TextAbsorber absorber;
    absorber.Visit(doc);
    std::cout << absorber.Text() << "\n";

    // Extract text fragments from page 1
    Aspose::Pdf::Text::TextFragmentAbsorber fragmentAbsorber;
    fragmentAbsorber.Visit(doc.Pages()[1]);
    auto fragments = fragmentAbsorber.TextFragments();
    std::cout << "Fragments on page 1: " << fragments.Count() << "\n";
}

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

Страницы рендерятся в растровые форматы через классы устройств для каждого формата — PngDevice, JpegDevice, BmpDevice и TiffDevice — каждый реализует Process(page, output). Разрешение вывода контролируется классом Resolution.

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

int main() {
    Aspose::Pdf::Document doc("input.pdf");
    auto page = doc.Pages()[1];

    Aspose::Pdf::Devices::PngDevice png(Aspose::Pdf::Devices::Resolution(150));
    std::ofstream pngOut("page1.png", std::ios::binary);
    png.Process(page, pngOut);

    Aspose::Pdf::Devices::BmpDevice bmp(Aspose::Pdf::Devices::Resolution(150));
    std::ofstream bmpOut("page1.bmp", std::ios::binary);
    bmp.Process(page, bmpOut);
}

JpegDevice следует тому же шаблону Process(page, output) для вывода JPEG. TiffDevice дополнительно поддерживает вывод нескольких страниц за один вызов через Process(document, fromPage, toPage, output) и предоставляет RenderingOptions() для управления тем, как поля формы рендерятся в растровый вывод.

Шифрование и разрешения доступа

Document.Encrypt() защищает документ паролем пользователя и владельца, выбирая шифр через перечисление CryptoAlgorithm: RC4x40, RC4x128, AESx128 или AESx256. Предоставленные разрешения описываются типом Permissions, значения флагов которого включают PrintDocument, ModifyContent, ExtractContent, ModifyTextAnnotations, FillForm, ExtractContentWithDisabilities, AssembleDocument и PrintingQuality.

#include <aspose/pdf/document.hpp>

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

    doc.Encrypt("user-password", "owner-password",
                Aspose::Pdf::Permissions(),
                Aspose::Pdf::CryptoAlgorithm::AESx256);

    doc.Save("encrypted.pdf");
}

Уже открытый зашифрованный документ расшифровывается на месте с помощью Document.Decrypt(). Document.IsEncrypted() сообщает, содержит ли загруженный документ в данный момент словарь шифрования.

Аннотации

Аннотации уровня страницы — текстовые заметки, фигуры и разметка — доступны через Page.Annotations(), который возвращает AnnotationCollection. Отдельные элементы раскрывают общие свойства, такие как Contents(), Rect(), Color(), Border() и AnnotationType(), и могут быть удалены со страницы или преобразованы в статическое содержимое.

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

int main() {
    Aspose::Pdf::Document doc("input.pdf");
    auto& annotations = doc.Pages()[1].Annotations();

    std::cout << "Annotation count: " << annotations.Count() << "\n";
    for (int i = 0; i < static_cast<int>(annotations.Count()); ++i) {
        std::cout << "Contents: " << annotations[i].Contents() << "\n";
    }

    // Remove the first annotation on the page
    if (annotations.Count() > 0) {
        annotations.Delete(annotations[0]);
    }

    doc.Save("output.pdf");
}

Любой отдельный Annotation также может быть напрямую преобразован в статическое содержимое страницы с помощью собственного метода Flatten(), независимо от описанного ниже процесса преобразования форм в статический вид.

Интерактивные формы

AcroForm поля в документе управляются через Document.Form(), который возвращает экземпляр Form, поддерживающий Count(), HasField(fieldName), Delete(fieldName) и Flatten(). Новые поля добавляются с помощью Form.Add(field, pageNumber), где field — конкретный подтип Field, такой как TextBoxField, CheckboxField, ChoiceField или ButtonField.

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

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

    std::cout << "Form fields: " << form.Count() << "\n";

    if (form.HasField("Signature1")) {
        form.Delete("Signature1");
    }

    // Convert every remaining field into static page content
    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)

Откройте документ, извлеките его текст и отрендерите первую страницу в PNG:

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/png_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::PngDevice png(Aspose::Pdf::Devices::Resolution(150));
    std::ofstream out("page1.png", std::ios::binary);
    png.Process(doc.Pages()[1], out);
}

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

ФорматРасширениеЧитатьПисать
BMPbmp—✓
JPEGjpeg—✓
TIFFtiff—✓
Texttxt—✓
SVGsvg✓—

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

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

Коммерческое использование разрешено согласно условиям лицензии MIT. Если вашему проекту требуется поддержка корпоративного уровня, расширенное покрытие форматов или интеграция с облаком, Aspose.PDF — Enterprise Product Family представляет собой отдельное коммерческое предложение.


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

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