Как загрузить документ PSD в Python
PsdImage.load — единственная публичная точка входа для открытия документа PSD/PSB — она принимает либо путь к файлу, либо уже открытый читаемый поток. Низкоуровневый читатель секция-за-секцией, которому она делегирует работу внутри, не вызывается напрямую.
Пошаговое руководство
Шаг 1: Установите пакет
git clone https://github.com/aspose-psd-foss/Aspose.PSD-FOSS-for-Python.git
cd Aspose.PSD-FOSS-for-Python
# No packaging manifest is published yet -- run from this folder,
# or add it to PYTHONPATH:
export PYTHONPATH=$PWD:$PYTHONPATHШаг 2: Импортируйте необходимые классы
from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.coreexceptions.psdloadexception import PsdLoadExceptionШаг 3: Загрузите из пути к файлу
image = PsdImage.load("input.psd")
print(f"Loaded: {image.width}x{image.height}")
image.dispose()Шаг 4: Загрузка из потока
Поток не обязательно должен поддерживать перемещение — load считывает всё его содержимое во внутренний буфер перед разбором:
with open("input.psd", "rb") as stream:
image = PsdImage.load(stream)
print(f"Loaded from stream: {image.width}x{image.height}")
image.dispose()Распространённые проблемы и решения
FileNotFoundError: File not found: .... Путь, переданный в load не указывает на существующий файл — load checks os.path.isfile перед попыткой открыть его.
PsdLoadException: Unexpected end of PSD/PSB data while reading the file structure. Исходный поток исчерпал данные в процессе разбора ( EOFError при чтении) — файл, вероятно, обрезан.
PsdLoadException: Failed to read PSD/PSB data from the source stream. Произошла ошибка ввода/вывода при чтении самого потока, обернутая и повторно выброшена как PsdLoadException.
ArgumentNullException при вызове load. load был вызван с None в качестве аргумента stream.
Часто задаваемые вопросы
Нужно ли перемещать указатель потока к его началу перед вызовом load?
Нет — если поток поддерживает перемещение, load восстанавливает его исходную позицию после чтения; если перемещение невозможно, load всё равно работает, поскольку буферизует содержимое потока внутри перед разбором.
В чём разница между двумя вышеуказанными ошибками FileNotFoundError/PsdLoadException?
Отсутствующий путь к файлу вызывает стандартный FileNotFoundError до начала любого разбора. A PsdLoadException вместо этого означает, что файл (или stream) был найден и открыт, но данные PSD/PSB сами по себе усечены, повреждены или иначе нечитаемы после начала разбора — см. также Troubleshooting для связанных с версией и границами PsdLoadException вариантов.