Я пытаюсь декодировать изображение с кодировкой base64 и помещать его в PDF, который я генерирую с помощью ReportLab. Я в настоящее время сделать это так, что (image_data
является base64-кодированное изображение, story
уже рассказе ReportLab в):Включая изображение с кодировкой base64 в созданном ReportLab PDF
# 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, но есть ли способ избежать создания именованных временных файлов и делать это только с файлоподобными объектами без записи файлов на диск?