2012-04-02 4 views
2

Я пытаюсь декодировать изображение с кодировкой 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, но есть ли способ избежать создания именованных временных файлов и делать это только с файлоподобными объектами без записи файлов на диск?

ответ

0

Я не знаком с ReportLab, но если вы можете использовать PIL непосредственно это будет работать:

... 
img = Image.open(img_file) 
width, height = img.size 
... 

вы можете посмотреть здесь PIL класса Image references

2

Вы должны обернуть StringIO() по PIL.Image.open, поэтому просто img_size = ImageReader(PIL.Image.open(img_file)).getSize(). На самом деле это тонкая обложка вокруг Image.size, как говорит Томмазо. Кроме того, на самом деле нет необходимости вычислять размер DESc самостоятельно, bound режим reportlab.Image может сделать это для вас:

img_height = 1.5 * inch # max image height 
img_file = StringIO.StringIO(image_data.decode('base64')) 
img_file.seek(0) 
img = Image(PIL.Image.open(img_file), 
      width=float('inf'), 
      height=img_height, 
      kind='bound') 
) 
story.append(img) 
0

Этот код работает для меня без PIL, поскольку изображение уже JPEG: raw просто вытаскивает строку base64 из словаря. Я просто обертываю декодированную «строку» в StringIO.

 raw = element['photographs'][0]['jpeg'] 
     photo = base64.b64decode(raw) 
     c.drawImage(ImageReader(StringIO.StringIO(photo)), 0.5*inch, self.y, height = self.PHOTOHEIGHT, preserveAspectRatio = True) 
Смежные вопросы