2017-11-01 19 views
1

matplotlib를 사용하여 그래프를 만든 다음 이미지 파일을 디스크에 저장하지 않고 python-pptx를 사용하여 ppt 파일에 저장하려고합니다.matplotlib와 함께 사용할 때 python-pptx가 StringIo 파일 형식을 허용하지 않습니다.

나는 add_picture() 객체와 같은 파일을 허용하지만 여전히 난이 오류가 얻을 것을 볼 수 파이썬 PPTX의 documentation 표시되는 경우이 아래에있는 내 코드

File "a.py", line 39, in <module> 
    pic = slide.shapes.add_picture(image_stream, left, top) 
    File "/usr/local/lib/python2.7/dist-packages/pptx/shapes/shapetree.py", line 496, in add_picture 
    image_part, rId = self.part.get_or_add_image_part(image_file) 
    File "/usr/local/lib/python2.7/dist-packages/pptx/parts/slide.py", line 42, in get_or_add_image_part 
    image_part = self._package.get_or_add_image_part(image_file) 
    File "/usr/local/lib/python2.7/dist-packages/pptx/package.py", line 50, in get_or_add_image_part 
    return self._image_parts.get_or_add_image_part(image_file) 
    File "/usr/local/lib/python2.7/dist-packages/pptx/package.py", line 161, in get_or_add_image_part 
    image_part = ImagePart.new(self._package, image) 
    File "/usr/local/lib/python2.7/dist-packages/pptx/parts/image.py", line 44, in new 
    partname = package.next_image_partname(image.ext) 
    File "/usr/local/lib/python2.7/dist-packages/pptx/util.py", line 136, in get_prop_value 
    value = f(obj) 
    File "/usr/local/lib/python2.7/dist-packages/pptx/parts/image.py", line 238, in ext 
    format = self._format 
    File "/usr/local/lib/python2.7/dist-packages/pptx/parts/image.py", line 273, in _format 
    return self._pil_props[0] 
    File "/usr/local/lib/python2.7/dist-packages/pptx/util.py", line 136, in get_prop_value 
    value = f(obj) 
    File "/usr/local/lib/python2.7/dist-packages/pptx/parts/image.py", line 282, in _pil_props 
    pil_image = PIL_Image.open(stream) 
    File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 2572, in open 
    % (filename if filename else fp)) 
IOError: cannot identify image file <StringIO.StringIO instance at 0x7f30d72a92d8> 

입니다 :

import matplotlib.pyplot as plt 

from StringIO import StringIO 


from pptx import Presentation 
from pptx.util import Inches 


image_stream = StringIO() 


# plot a simple graph 
plt.plot([1, 2, 3, 4], [1, 4, 9, 16]) 
plt.ylabel('some numbers') 

# saving image file from matplotlib to memory 
plt.savefig(image_stream) 



prs = Presentation() 
title_slide_layout = prs.slide_layouts[0] 
slide = prs.slides.add_slide(title_slide_layout) 
title = slide.shapes.title 
subtitle = slide.placeholders[1] 

left = top = Inches(1) 

## this line throws error, but why ???????? 
pic = slide.shapes.add_picture(image_stream, left, top) 


prs.save('test.pptx') 

무엇 나는 실종 됐어?

답변

2

당신은 .add_picture()로 보내기 전에 다시 "파일"의 시작 부분에있는 StringIO 객체의 커서의 위치를 ​​변경해야합니다 :

image_stream.seek(0) 
picture = slide.shapes.add_picture(image_stream, left, top) 

쓰기 작업은 파일의 끝 부분에 커서를 둡니다 (추가 쓰기 조작 준비). 그러나 .add_picture() 코드는 내용을 가져 오기 위해 .read()에만 전화 할 수 있으므로 (.seek()은 모든 파일과 유사한 개체에서 사용할 수 없음) 호출하기 전에 커서의 위치를 ​​변경해야합니다.

+0

매력처럼 작동합니다. 고마워요. :) – anekix

+0

내가 가지고있는 또 하나의 문제는 ppt에 저장되는 이미지가 저해상도이지만 디스크에 저장할 때 고해상도 이미지를 얻는 것입니다. 포맷 관련 일 수 있습니까? 나는'forat = 'svg''을 add_picture()에 전달하려고했지만 위와 같은 오류가 발생합니다. – anekix

+0

그건 정말 별개의 질문입니다. @anekix. 'python-pptx'태그와 함께 게시하면 알 수 있습니다. 아마도 'python-pptx .add_picture()와 같이 저해상도 이미지를 생성합니다.' – scanny