Введение

document.py, модуль, который определяет Aspose.PDF FOSS для класса Document в Python, описывает его как класс, который «оборачивает нативный PDF-движок». Конкретно, этот движок — aspose_pdf.engine.simple_pdf.SimplePdf: Document.load_from создает экземпляр SimplePdf, и каждая операция уровня документа — сохранение, оптимизация, ремонт, шифрование — делегируется ему. То же самое относится и к рендерингу: Page.render и Document.render_page оба вызывают aspose_pdf.engine.rasterizer.

Большинству кода приложений никогда не нужно смотреть дальше Document и Page. Однако aspose_pdf.engine — обычный импортируемый пакет Python, и несколько компонентов под фасадом полезны сами по себе: растеризатор, который преобразует страницу в пиксели, кодеки потоковых фильтров, сжимающие и распаковывающие потоки содержимого PDF, и утилиты шифрования, реализующие алгоритмы AES-CBC и RC4, на которые опираются обработчики безопасности PDF. В отличие от основного пакета, подпакеты aspose_pdf.engine не переэкспортируются из верхнего уровня aspose_pdf — единственное исключение— RasterizedPage, связанный через aspose_pdf.visualization — поэтому всё ниже импортируется по полному точечному пути, например from aspose_pdf.engine.filters import StreamDecoder.

Aspose.PDF FOSS для Python — пакет Python, aspose-pdf-foss-for-python, выпущенный под лицензией MIT, требующий Python3.11 или новее. Его имя верхнего уровня модуля — aspose_pdf. Ядро пакета зависит только от cryptography и asn1crypto; дополнительные опции добавляют декодирование изображений на основе Pillow, поддержку шрифтов WOFF2 на основе Brotli и сложную компоновку текста на основе HarfBuzz.


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

Отображение страниц с помощью растеризационного движка

Document.render_page(page_index, dpi=..., scale=..., background=..., antialias=...) и его аналог Page.render оба возвращают RasterizedPage — упакованный RGB-растер, созданный растеризатором движка. RasterizedPage предоставляет width, height и необработанные байты pixels, а также get_pixel() для поиска отдельного пикселя, to_png() / to_tiff() для закодированных байтов в памяти и save() для прямой записи файла .png или .tif/.tiff. Работа с объектом в памяти — вместо только сохранения на диск — полезна, когда вызывающая сторона хочет исследовать или преобразовать пиксели, прежде чем решить, сохранять их или нет.

from aspose_pdf import Document

with Document() as document:
    page = document.pages.add()
    page.add_text("Rendered by the engine", x=72, y=700, font_size=18)

    raster = document.render_page(0, dpi=150)
    print(raster.width, raster.height)

    corner = raster.get_pixel(0, 0)
    print("top-left pixel:", corner)

    with open("page-0.png", "wb") as handle:
        handle.write(raster.to_png())
    raster.save("page-0.tiff")

Движок фильтра потоков

Содержимое PDF и потоки объектов сжимаются с помощью именованных фильтров, таких как FlateDecode и LZWDecode. aspose_pdf.engine.filters.StreamEncoder.encode(data, filters, decode_parms=None) и StreamDecoder.decode(data, filters, decode_parms, *, limits=None, max_output_bytes=None) реализуют стороны кодирования и декодирования этой цепочки фильтров — те же кодеки, которые движок использует внутренне при записи и чтении потоков документа. Оба принимают одиночное имя фильтра или список для цепочных фильтров, и StreamDecoder.decode() генерирует PdfValidationException при нераспознанном имени фильтра вместо того, чтобы тихо возвращать неправильные байты.

from aspose_pdf.engine.filters import StreamDecoder, StreamEncoder

raw = b"Sample content-stream payload.\n" * 40
compressed = StreamEncoder.encode(raw, "FlateDecode")
restored = StreamDecoder.decode(compressed, "FlateDecode", None)

assert restored == raw
print(f"{len(raw)} bytes -> {len(compressed)} bytes with FlateDecode")

Движок шифрования

aspose_pdf.engine.encryption.EncryptionUtils — это класс утилит со статическими методами, к которому SimplePdf обращается для каждой операции, связанной с шифрованием: Document.encrypt, decrypt() и change_passwords() все сводятся к вызовам EncryptionUtils под капотом. Его методы реализуют AES-CBC и шифрование RC4 напрямую (encrypt_aes_cbc, decrypt_aes_cbc, encrypt_rc4, decrypt_rc4), вывод ключей для стандартных ревизий обработчика безопасности PDF (compute_owner_key_v4, compute_user_key_v4, compute_user_owner_keys_v6) и generate_file_id() для случайного 16-байтового идентификатора, необходимого новым документам.

from aspose_pdf.engine.encryption import EncryptionUtils

key = b"0123456789ABCDEF"  # 16 bytes -> AES-128
ciphertext = EncryptionUtils.encrypt_aes_cbc(key, b"Reviewer notes: approved")
plaintext = EncryptionUtils.decrypt_aes_cbc(key, ciphertext)
assert plaintext == b"Reviewer notes: approved"

file_id = EncryptionUtils.generate_file_id()
print(file_id.hex())

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

Установите пакет, затем отрендерите страницу напрямую из уровня движка в одном скрипте.

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("Engine-rendered page", x=72, y=740, font_size=20)

    raster = document.render_page(0, dpi=150)
    raster.save("engine-render.png")

    document.save("engine-quickstart.pdf")

print("Saved engine-quickstart.pdf and engine-render.png")

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

ФорматРасширениеЧтениеЗапись
PDFpdfДаДа
TIFFtiff-Пожалуйста,

Чтение и запись PDF Aspose.PDF FOSS для основной функции Python — пара движков Document/SimplePdf загружает и записывает PDF-документы на каждом пути кода в этой статье. Document.render_page, Page.render и RasterizedPage.to_png() / to_tiff() дополнительно генерируют растровый вывод PNG и TIFF; это вывод растеризации страниц, а не форматы загрузки документов.


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

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


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

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