Введение

Aspose.PDF FOSS для Python — это новая открытая библиотека для работы с PDF-документами из кода Python. Она распространяется под лицензией MIT и полностью реализована на Python — парсер PDF, писатель, растеризатор страниц и функции шифрования входят в сам пакет, при этом необходимые зависимости ограничиваются cryptography и asn1crypto. Дополнительные опции добавляют поддержку изображений на основе Pillow, декодирование шрифтов WOFF2 на основе Brotli и сложную типографику на основе HarfBuzz.

Библиотека построена вокруг класса Document, который загружает PDF из пути, байтов или бинарного потока и предоставляет доступ к его страницам через document.pages, PageCollection, поддерживающий итерацию, индексацию и срезы. Далее API охватывает добавление текста и изображений на страницы, чтение и изменение аннотаций, создание и заполнение полей AcroForm, шифрование и расшифровку документов, а также извлечение текста и вложений — операции, необходимые для создания новых PDF-файлов или работы с существующими.

Этот релиз предназначен для разработчиков, которым нужна обработка PDF внутри кодовой базы Python без коммерческой лицензии: генерация отчетов и счетов-фактур, конвейеры загрузки документов, автоматизация заполнения форм и сервисы, которым необходимо рендерить страницы PDF в изображения или извлекать текст для последующей индексации. Проект находится в альфа-версии, поэтому API и набор функций могут измениться до первого стабильного выпуска. Требуется Python версии 3.11 или новее.

Что включено

Создание и загрузка документов

PdfDocument() создает пустой PDF; PdfDocument(source, password=..., limits=...) загружает существующий из пути, необработанных байтов или бинарного потока и эквивалентен вызову PdfDocument().load_from(source, ...). Оба возбуждают исключение при отсутствии файла, данных не в формате PDF или отсутствующем пароле, вместо возврата пустого документа. PdfDocument является менеджером контекста, поэтому ресурсы освобождаются автоматически при выходе из блока with.

from aspose_pdf import Document

with Document() as document:
    page = document.pages.add()
    page.add_text("Generated by Aspose.PDF FOSS", x=72, y=720, font_size=14)
    document.save("report.pdf")

with Document("report.pdf") as document:
    print(f"Pages: {document.page_count}")
    print(f"PDF version: {document.version}")

Добавление текста и изображений

Page.add_text размещает текст Standard‑14 или встроенный Unicode‑текст в позиции x/y с заданным font_size; аргумент font может быть FontDescriptor, необработанными байтами шрифта или путём к TrueType/OpenType шрифту для Unicode за пределами кодировок Standard‑14. Page.add_image размещает необработанный, JPEG или PNG объект изображения XObject на странице в указанной позиции и размере.

from aspose_pdf import Document

with Document() as document:
    page = document.pages.add()
    page.add_text(
        "Quarterly Summary",
        x=72,
        y=740,
        font_size=16,
    )
    page.add_image(
        "chart.png",
        x=72,
        y=420,
        width=300,
        height=200,
    )
    document.save("summary.pdf")

Аннотации

Каждый Page раскрывает свои аннотации через page.annotations, являющийся AnnotationCollection. add(subtype, rect, contents, title, appearance_normal, properties) создаёт и вставляет аннотацию стандартного подтипа, такого как Square, Circle, Line, Highlight или FreeText, возвращая Annotation. Вызов generate_appearance() на возвращённой аннотации синтезирует поток отображения из её геометрии и свойств.

from aspose_pdf import Document

with Document() as document:
    page = document.pages.add()
    annotation = page.annotations.add(
        "Square",
        (100, 600, 300, 680),
        "Needs review",
        properties={"C": [1, 0, 0]},
    )
    annotation.generate_appearance()
    document.save("annotated.pdf")

Поля формы

document.form возвращает Form документа, который напрямую создаёт поля AcroForm: add_text_field(), add_checkbox(), add_radio_group(), add_list_box(), add_combo_box() и add_push_button() каждый принимает имя поля, Page или индекс страницы и прямоугольник размещения, возвращая Field. Установка field.value обновляет значение поля, а form.flatten() фиксирует отображение каждого поля в статическое содержимое страницы.

from aspose_pdf import Document

with Document() as document:
    page = document.pages.add()
    form = document.form
    field = form.add_text_field(
        "customer_name",
        page,
        (72, 700, 300, 720),
    )
    field.value = "Jane Doe"
    form.flatten()
    document.save("form.pdf")

Шифрование

Document.encrypt(user_password, owner_password, permissions) защищает документ пользовательским паролем, паролем владельца и битовой маской разрешений, возвращая тот же Document для цепочечного вызова. Document.decrypt(password) отменяет операцию, а свойство is_encrypted сообщает текущее состояние. Повторная загрузка зашифрованного документа требует передачи password= в конструктор или в load_from().

from aspose_pdf import Document

with Document("report.pdf") as document:
    document.encrypt(user_password="user-pass", owner_password="owner-pass", permissions=0)
    document.save("encrypted.pdf")

with Document("encrypted.pdf", password="user-pass") as document:
    print(f"Encrypted: {document.is_encrypted}")

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

PdfExtractor привязывается к источнику с bind_pdf(), затем extract_text() проходит по страницам документа. get_text() возвращает весь извлечённый текст сразу, в то время как has_next_page_text() и get_next_page_text() итерируют результат постранично. PdfExtractor также является менеджером контекста.

from aspose_pdf import PdfExtractor

with PdfExtractor() as extractor:
    extractor.bind_pdf("report.pdf")
    extractor.extract_text()
    while extractor.has_next_page_text():
        print(extractor.get_next_page_text())

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

git clone https://github.com/aspose-pdf-foss/Aspose-PDF-FOSS-for-Python.git
cd Aspose-PDF-FOSS-for-Python
pip install -e .
from aspose_pdf import Document

with Document() as document:
    page = document.pages.add()
    page.add_text(
        "Hello from Aspose.PDF FOSS!",
        x=72,
        y=720,
        font_size=18,
    )
    document.save("hello.pdf")

with Document("hello.pdf") as document:
    print(f"Pages: {document.page_count}")
    print(f"PDF version: {document.version}")

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

ФорматРасширениеЧтениеЗапись
PDF.pdf✓✓
PNG.png—✓
TIFF.tiff—✓

PDF является основным форматом ввода и вывода библиотеки, читается через Document/load_from() и записывается через Document.save. PNG и TIFF — это выводы постраничного рендеринга, создаваемые Page.render, Page.save_as_image и Document.save_page_as_image.


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

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


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

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