Введение
Aspose.PDF FOSS для Python включает подпакет aspose_pdf.generated с четырьмя модулями: document.py, forms.py, pdfa.py и security.py. Ни один из них не переэкспортируется из верхнеуровневого пакета aspose_pdf, поэтому каждый класс в этом руководстве импортируется по его полному точечному пути — from aspose_pdf.generated.document import Document, а не from aspose_pdf import Document.
Четыре модуля используют два разных подхода. generated.document, generated.forms и generated.pdfa каждый определяют свои собственные классы: независимые реализации, которые отражают структуру основных пакетов Document, UnsignedContent/UnsignedContentAbsorber и PdfAValidateOptions/PdfAValidationResult — полезно для кода, написанного под эту зеркальную структуру пространств имён, но это реальный, отдельный набор классов, а не псевдонимы. generated.security, с другой стороны, вовсе не делает пере-реализацию: он импортирует CompromiseCheckResult, SignaturesCompromiseDetector и перечисления валидации напрямую из aspose_pdf.security и aspose_pdf.validation и переэкспортирует их, так что оба пути импорта разрешаются к одинаковому объекту класса.
Это руководство охватывает все четыре модуля и явно указывает, где класс generated ведёт себя иначе, чем его аналог из основного пакета с тем же именем — Document и UnsignedContentAbsorber существуют в двух местах с двумя разными реализациями, что именно тот случай, когда легко ошибиться, импортируя только по имени.
Aspose.PDF FOSS для Python — это Python пакет, aspose-pdf-foss-for-python, выпущенный под лицензией MIT, требующий Python версии 3.11 или новее. Его верхнеуровневое имя модуля — aspose_pdf; см. раздел «Быстрый старт» ниже для установки. Ядро пакета зависит только от cryptography и asn1crypto; дополнительные опции добавляют декодирование изображений на основе Pillow, поддержку шрифтов WOFF2 на основе Brotli и сложную верстку текста на основе HarfBuzz.
Ключевые возможности
Вторая реализация документа
aspose_pdf.generated.document.Document реализует тот же основной жизненный цикл, что и основной aspose_pdf.Document — load_from(), save(), encrypt()/decrypt()/change_passwords(), optimize()/optimize_resources(), repair(), flatten() и validate()/check() — поверх того же движка aspose_pdf.engine.simple_pdf.SimplePdf. Он отражает подмножество основного Document: не имеет pages.add()-подобного создания страниц, не поддерживает form/outlines/attachments и не имеет render_page(). Поскольку имя класса конфликтует с Document основного пакета, импортируйте его под псевдонимом, когда оба требуются в одном модуле.
from aspose_pdf import Document
from aspose_pdf.generated.document import Document as CompatDocument
with Document() as document:
document.pages.add()
document.save("source.pdf")
compat = CompatDocument()
compat.load_from("source.pdf")
print(compat.page_count, compat.is_encrypted)
compat.optimize(compress_images=True)
compat.save("optimized.pdf", overwrite=True)
compat.dispose()
Упаковка неподписанного контента
aspose_pdf.generated.forms.UnsignedContentAbsorber и UnsignedContent предоставляют контейнер для неподписанных полей форм, страниц и аннотаций. Это отличается от верхнеуровневого aspose_pdf.UnsignedContentAbsorber(document), который принимает реальный Document и фильтрует его form_fields/annotations на предмет элементов, у которых атрибут is_signed/signed имеет ложное значение. Версия generated.forms не принимает документ вовсе — extract() просто упаковывает любые pages, form_fields и annotations, которые вы передаете ей в виде именованных аргументов, в экземпляр UnsignedContent, что полезно, когда неподписанные элементы уже собраны где-то ещё и требуется только общий контейнер и его add_page()/remove_page()-подобные мутаторы.
from aspose_pdf.generated.forms import UnsignedContentAbsorber
absorber = UnsignedContentAbsorber()
content = absorber.extract(
form_fields=["signature_field", "initials_field"],
annotations=["review_stamp"],
)
print(absorber.has_extracted(), content.form_fields, content.annotations)
content.add_page("page-1")
absorber.reset()
print(absorber.get_extracted())
Опции проверки PDF/A и результаты
aspose_pdf.generated.pdfa.PdfAValidateOptions собирает настройки проверки и источники ввода; PdfAValidationResult собирает результат. PdfAValidateOptions.add_input() проверяет строковый путь с помощью Path.exists() перед принятием и вызывает PdfIOException, если файл отсутствует, поэтому вызывающий код узнает о неверном пути ввода сразу, а не во время проверки.
from aspose_pdf import Document
from aspose_pdf.exceptions import PdfIOException
from aspose_pdf.generated.pdfa import PdfAValidateOptions, PdfAValidationResult
with Document() as document:
document.pages.add()
document.save("candidate.pdf")
options = PdfAValidateOptions()
options.set_option("pdfa_version", "PDF/A-2b")
options.add_input("candidate.pdf")
print(options.get_options(), options.inputs)
try:
options.add_input("missing.pdf")
except PdfIOException as error:
print(f"rejected: {error}")
result = PdfAValidationResult()
result.add_error("Missing /OutputIntent for PDF/A-2b")
print(result.is_valid, result.to_dict())
Переэкспортированные типы безопасности и проверки
aspose_pdf.generated.security импортирует CompromiseCheckResult и SignaturesCompromiseDetector напрямую из aspose_pdf.security, а также CertificationLevel, RevocationStatus, TrustStatus, ValidationMethod, ValidationMode, ValidationOptions, ValidationResult и ValidationStatus из aspose_pdf.validation. В отличие от Document и UnsignedContentAbsorber, здесь нет независимой пере реализации — оба пути импорта возвращают один и тот же объект.
from aspose_pdf.generated.security import SignaturesCompromiseDetector
from aspose_pdf.security import SignaturesCompromiseDetector as CanonicalDetector
assert SignaturesCompromiseDetector is CanonicalDetector
detector = SignaturesCompromiseDetector(document=None)
result = detector.check()
print(result.compromised, result.reasons)
Быстрый старт
Установите пакет, затем создайте документ с основным Document, сохраните его и пропустите через параметры generated.pdfa и объекты результата.
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
from aspose_pdf.generated.pdfa import PdfAValidateOptions, PdfAValidationResult
with Document() as document:
page = document.pages.add()
page.add_text("PDF/A candidate", x=72, y=740, font_size=20)
document.save("candidate.pdf")
options = PdfAValidateOptions()
options.set_option("pdfa_version", "PDF/A-2b")
options.add_input("candidate.pdf")
result = PdfAValidationResult()
if not options.inputs:
result.add_error("No inputs registered")
print(result.to_dict())
Поддерживаемые форматы
| Формат | Расширение | Читать | Записать |
|---|---|---|---|
| Да | Да |
Чтение и запись PDF Aspose.PDF FOSS для основной функции Python. Каждый класс в этом руководстве — основной Document, зеркальный generated.document.Document и вспомогательные PDF/A — работает с входными и выходными PDF через общий движок SimplePdf; aspose_pdf.generated меняет тот класс, который вы импортируете, а не формат обрабатываемого файла.
Открытый исходный код и лицензирование
Aspose.PDF FOSS для Python выпущен под лицензией MIT: нет ограничений по использованию, нет платы за выполнение и нет требований к регистрации для коммерческого или личного использования. Исходный код размещён по адресу github.com/aspose-pdf-foss/Aspose-PDF-FOSS-for-Python, а пакет опубликован на PyPI как aspose-pdf-foss-for-python.