Вступ
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, що вимагає Python 3.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-байтового ID, потрібного новим документам.
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")
Підтримувані формати
| Формат | Розширення | Читати | Запис |
|---|---|---|---|
| Так | Так | ||
| TIFF | tiff | - | Так |
Читання та запис PDF є Aspose.PDF FOSS для Python’s core function — пара двигунів 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.