Я пытаюсь декодировать изображение в кодировке base64 и поместить его в PDF-файл, созданный с помощью ReportLab. В настоящее время я делаю это так (image_data
- это изображение в кодировке base64, story
- это уже история ReportLab):
# There is some "story" I append every element
img_height = 1.5 * inch # max image height
img_file = tempfile.NamedTemporaryFile(mode='wb', suffix='.png')
img_file.seek(0)
img_file.write(image_data.decode('base64'))
img_file.seek(0)
img_size = ImageReader(img_file.name).getSize()
img_ratio = img_size[0] / float(img_size[1])
img = Image(img_file.name,
width=img_ratio * img_height,
height=img_height,
)
story.append(img)
и это работает (хотя мне все еще некрасиво). Я думал о том, чтобы избавиться от временного файла (разве файловый объект не добился цели?).
Чтобы избавиться от временного файла, я попытался использовать модуль StringIO
, чтобы создать файлоподобный объект и передать его вместо имени файла:
# There is some "story" I append every element
img_height = 1.5 * inch # max image height
img_file = StringIO.StringIO()
img_file.seek(0)
img_file.write(image_data.decode('base64'))
img_file.seek(0)
img_size = ImageReader(img_file).getSize()
img_ratio = img_size[0] / float(img_size[1])
img = Image(img_file,
width=img_ratio * img_height,
height=img_height,
)
story.append(img)
Но это дает мне IOError со следующим сообщением: « не может идентифицировать файл изображения ».
Я знаю, что ReportLab использует PIL для чтения изображений, отличных от jpg, но есть ли способ избежать создания именованных временных файлов и делать это только с файловыми объектами, без записи файлов на диск?