Как создавать документы с помощью сгенерированного модуля совместимости в Python

Как создавать документы с помощью сгенерированного модуля совместимости в Python

Aspose.PDF FOSS для Python поставляется с подпакетом совместимости generated (aspose_pdf.generated), который отражает стабильный набор основной поверхности API — класс Document с основными операциями жизненного цикла, плюс UnsignedContent/UnsignedContentAbsorber и PdfAValidateOptions/PdfAValidationResult. Он существует для вызывающих, которым нужен этот более узкий набор явно, а не полностью функциональные верхнеуровневые классы, и его классы не импортируются автоматически import aspose_pdf — вы импортируете их напрямую из aspose_pdf.generated.*. Пакет полностью написан на Python и устанавливается командой ниже.

Пошаговое руководство

Шаг 1: Установить пакет

Установите пакет Aspose.PDF FOSS:

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

Проверьте установку, импортировав сгенерированный Document и выведя подтверждающее сообщение:

import aspose_pdf
from aspose_pdf.generated.document import Document
print("aspose-pdf-foss-for-python is ready.")

Шаг 2: Импортировать необходимые классы

Совместимые классы generated находятся в aspose_pdf.generated.document, aspose_pdf.generated.forms и aspose_pdf.generated.pdfa — импортируйте их явно по подпакету:

import aspose_pdf
from aspose_pdf.generated.document import Document
from aspose_pdf.generated.forms import UnsignedContent, UnsignedContentAbsorber
from aspose_pdf.generated.pdfa import PdfAValidateOptions, PdfAValidationResult

Шаг 3: Создать и загрузить документ

Document(source) загружается сразу, когда предоставлен источник; вызов Document() без аргументов создает пустой объект, который позже можно загрузить с помощью load_from. Оба принимают путь к файлу, bytes или бинарный поток:

from aspose_pdf.generated.document import Document

document = Document("report.pdf")
print(f"Loaded {len(document.pages)} page(s)")

empty_doc = Document()
empty_doc.load_from("report.pdf")

Шаг 7: Извлечь неподписанное содержимое формы

UnsignedContentAbsorber извлекает страницы, поля формы и аннотации, которые не являются частью цифровой подписи. Вызовите extract() для выполнения извлечения, has_extracted() чтобы проверить, было ли оно выполнено, и get_extracted() для получения результата повторно без повторного извлечения:

from aspose_pdf.generated.forms import UnsignedContentAbsorber

absorber = UnsignedContentAbsorber()
unsigned = absorber.extract()
print(f"Unsigned pages: {len(unsigned.pages)}")
print(f"Unsigned form fields: {len(unsigned.form_fields)}")

if absorber.has_extracted():
    same_result = absorber.get_extracted()

Шаг 8: Сформировать контейнер UnsignedContent вручную

UnsignedContent также является простым контейнером, который вы можете заполнять самостоятельно с помощью add_page, add_form_field и add_annotation — у каждого есть соответствующий метод remove_*, а reset() очищает все три коллекции одновременно:

from aspose_pdf.generated.forms import UnsignedContent

content = UnsignedContent()
content.add_page("page-1")
content.add_annotation("signature-placeholder")
print(content)  # UnsignedContent(pages=1, form_fields=0, annotations=1)

content.remove_annotation("signature-placeholder")
content.reset()

Шаг 9: Настройка и запуск проверки PDF/A

PdfAValidateOptions собирает входные данные и настройки для выполнения проверки. add_input(source) регистрирует вход, set_option(key, value) сохраняет именованную опцию, а get_options() возвращает копию сохранённых опций. PdfAValidationResult содержит результат — add_error(message) помечает результат как недействительный и добавляет в errors, а to_dict() выводит is_valid и errors как простой словарь:

from aspose_pdf.generated.pdfa import PdfAValidateOptions, PdfAValidationResult

options = PdfAValidateOptions()
options.add_input("report.pdf")
options.set_option("pdfa_version", "1b")
print(options.get_options())

result = PdfAValidationResult()
result.add_error("Font 'Arial' is not embedded")
print(result.is_valid)   # False
print(result.to_dict())

Общие проблемы и решения

ImportError or AttributeError при доступе aspose_pdf.generated

Подпакет generated не переэкспортируется import aspose_pdf — импортируйте каждый класс из его конкретного подмодуля, например from aspose_pdf.generated.document import Document, вместо того чтобы ожидать, что aspose_pdf.generated.Document будет работать после простого import aspose_pdf.

Смешивание сгенерированного Document с основным aspose_pdf.Document

aspose_pdf.Document (верхний класс, переэкспортированный import aspose_pdf) имеет более широкую поверхность — он добавляет методы, такие как validate_pdfa, iter_pages и redact_text, которые aspose_pdf.generated.document.Document не реализует. Если метод отсутствует в сгенерированном Document, проверьте, принадлежит ли он вместо этого верхнему классу Document.

save() raises AsposePdfException: Cannot save a disposed document

close()/dispose() освобождает внутреннее состояние документа навсегда — утилизированный Document нельзя сохранить, оптимизировать или восстановить впоследствии. Выполните все оставшиеся операции до вызова close(), либо перезагрузите из источника с новым вызовом Document(...).

change_passwords raises PdfSecurityException: Document is not encrypted

change_passwords только меняет пароль в документе, который уже зашифрован. Сначала вызовите encrypt(password), либо проверьте document.is_encrypted перед попыткой изменить пароль.

PdfAValidationResult.add_error raises TypeError

add_error требует аргумент str. Преобразуйте объекты исключений или другие детали ошибки в строку (str(error)) перед передачей их в add_error.

Часто задаваемые вопросы

Зачем aspose_pdf.generated существует рядом с основным aspose_pdf.Document?

Он отражает более узкое, стабильное подмножество Aspose.PDF API для кода, написанного против этой сокращённой поверхности. Новый код, которому не требуется специально это совместимое подмножество, обычно должен использовать верхнеуровневый aspose_pdf.Document, который поддерживает больше операций (PDF/A конверсия, перебор страниц, удаление текста и другие).

Принимает ли UnsignedContentAbsorber.extract() Document для сканирования?

extract() принимает позиционные и именованные аргументы, которые используются для заполнения коллекций pages, form_fields и annotations возвращаемого UnsignedContent — передайте нужные вам коллекции как именованные аргументы (pages=, form_fields=, annotations=).

Что произойдёт, если я вызову reset() на UnsignedContentAbsorber до извлечения чего-либо?

Он очищает любой ранее извлечённый результат. Затем get_extracted() возвращает None, а has_extracted() возвращает False до тех пор, пока extract() не будет вызван снова.

Можно ли вызвать PdfAValidateOptions.add_input более одного раза?

Да — каждый вызов добавляет ещё одну запись в список inputs и возвращает self, поэтому вызовы можно цепочкой: options.add_input("a.pdf").add_input("b.pdf").

Отличается ли close() от dispose() в сгенерированном Document?

Нет — close() — прямой псевдоним, который вызывает dispose() с теми же аргументами; любое из этих имён освобождает ресурсы документа.

См. также:

 Русский