Как загрузить документ в Python
Aspose.PDF FOSS для Python загружает PDF из пути к файлу, необработанных байтов или бинарного потока в объект Document, который вы можете просматривать и изменять. Библиотека полностью написана на Python и устанавливается одной командой.
Пошаговое руководство
Шаг 2: Импортировать необходимые классы
Импортируйте Document для загрузки и хранения PDF, а также классы исключений, которые вы будете обрабатывать при ошибке загрузки:
from aspose_pdf import (
Document,
InvalidPasswordException,
InvalidPdfFileFormatException,
PdfCorruptedError,
PdfParseException,
)Шаг 3: Загрузить PDF из пути к файлу
Передайте путь к файлу напрямую конструктору Document или явно вызовите load_from на существующем экземпляре — оба принимают путь, bytes, или бинарный поток. Используйте Document как контекстный менеджер, чтобы файловые дескрипторы освобождались автоматически:
from aspose_pdf import Document
with Document("report.pdf") as document:
print(f"Loaded {document.page_count} page(s)")Форма конструктора Document(source) эквивалентна Document().load_from(source):
document = Document()
document.load_from("report.pdf")
print(f"Loaded {document.page_count} page(s)")
document.close()Шаг 4: Загрузить PDF, защищённый паролем
Как Document(source, password=...), так и Document.load_from(source, password, limits) принимают аргумент password для PDF-файлов, зашифрованных пользовательским паролем:
from aspose_pdf import Document
with Document("locked.pdf", password="secret") as document:
print(f"Opened encrypted document: {document.page_count} page(s)")
print(f"Encrypted: {document.is_encrypted}")Если источник не защищён паролем, опустите аргумент — передача password=None (значение по умолчанию) также работает с обычными PDF.
Шаг 5: Обрабатывать исключения загрузки
Отсутствующий файл, данные не в формате PDF, отсутствие или неверный пароль, либо повреждённый PDF никогда не возвращают молча пустой Document — вместо этого генерируется исключение. Поймайте конкретные классы исключений, чтобы реагировать соответствующим образом:
from aspose_pdf import (
Document,
InvalidPasswordException,
InvalidPdfFileFormatException,
PdfCorruptedError,
PdfParseException,
)
try:
document = Document("report.pdf", password="maybe-wrong")
except InvalidPasswordException:
print("The PDF is encrypted; supply the correct password.")
except InvalidPdfFileFormatException:
print("The file is not a valid PDF.")
except PdfCorruptedError as error:
print(f"Unrecoverable corruption at offset {error.offset}: {error.message}")
except PdfParseException as error:
print(f"Could not parse the PDF: {error}")
else:
print(f"Loaded {document.page_count} page(s)")
document.close()PdfCorruptedError и его сопутствующий PdfMalformedError оба содержат свойства message, offset и recoverable, что удобно для журналирования точного места, где не удалось разобрать повреждённый файл. При обработке недоверенного ввода также ловите PdfResourceLimitException, которое генерируется, когда документ превышает политику безопасности PdfLoadLimits по умолчанию (размер входных данных, количество объектов, размер декодированного потока и аналогичные ограничения).
Шаг 7: Освободить ресурсы документа
Использование Document в качестве менеджера контекста (with Document(...) as document:) автоматически закрывает документ при выходе из блока. Когда вы создаёте Document за пределами блока with, вызовите close() или dispose() явно, как только закончите работу с ним:
document = Document()
document.load_from("report.pdf")
try:
print(document.page_count)
finally:
document.close()Распространённые проблемы и их решения
InvalidPasswordException выдаётся, хотя я не думал, что файл зашифрован
В исходном PDF установлен пользовательский пароль. Уточните это у источника файла, затем передайте правильное значение в качестве аргумента password функции Document(...) или load_from(...).
InvalidPdfFileFormatException на файле, который выглядит нормально
Файл не является корректным PDF — это может быть страница ошибки HTML, обрезанная загрузка или другой формат, сохранённый с расширением .pdf. Откройте файл в текстовом редакторе и убедитесь, что он начинается с %PDF-.
PdfCorruptedError на файле, который открывается в других просмотрщиках
Некоторые PDF-просмотрщики тихо исправляют повреждённую структуру. Document генерирует PdfCorruptedError при неисправимом повреждении и PdfMalformedError при исправимых структурных проблемах — проверьте свойство offset у исключения, чтобы найти проблемную область в потоке байтов.
PdfResourceLimitException на большом или сложном PDF
Документ превысил значение ограничения по умолчанию PdfLoadLimits (размер входных данных, количество объектов, размер декодированного потока и аналогичные ограничения, предназначенные для защиты от недоверенных данных). Создайте пользовательский PdfLoadLimits и передайте его как limits= в Document(...) или load_from(...), если файл надёжный и подходят более высокие лимиты.
Забыв закрыть Document открытый за пределами with block
Вызовите document.close() (или document.dispose()) после завершения работы, либо загрузите файл с помощью with Document(source) as document:, чтобы очистка происходила автоматически, даже если внутри блока возникнет исключение.
Часто задаваемые вопросы
Что можно передать в качестве аргумента source при загрузке PDF?
Document(source) и Document.load_from(source, password, limits) принимают путь к файлу, необработанный bytes или любой двоичный поток.
Как загрузить PDF, который уже находится в памяти, вместо того чтобы загружать его с диска?
Передайте объект bytes напрямую: Document(pdf_bytes), или вызовите document.load_from(pdf_bytes) у существующего экземпляра Document.
Требуется ли при загрузке PDF сразу правильный пароль, или можно сначала проверить?
is_encrypted доступен только после успешной загрузки, поэтому зашифрованный PDF необходимо открыть с правильным аргументом password в том же вызове. Перехватите InvalidPasswordException, если нужно запросить пароль интерактивно.