2017-02-09 20 views
1

저는 python-pptx v0.6.2를 사용하여 파워 포인트를 생성합니다. BytesIO에 존재하는 파워 포인트를 읽은 다음 수정하고 저장합니다. 파일을 성공적으로 다운로드 할 수 있으며 파일에 내용을 쓸 수 있다고 확신합니다. 그러나 파워 포인트를 열면 "Powerpoint가 foo.pptx의 컨텐츠에 문제가 있음을 알았습니다 .Powerpoint가 사전 설정을 복구 할 수 있습니다."라는 오류 메시지가 표시되면 "복구"버튼을 클릭해야합니다. 파워 포인트는 다음과 같이 표시됩니다. "수리"모드. 내 Python 버전은 3.5.2이고 Django 버전은 1.10입니다. 아래 코드는 내 코드입니다 :Django는 python-pptx 라이브러리를 사용하여 생성 된 파워 포인트에 오류 메시지가 있습니다.

with open('foo.pptx', 'rb') as f: 
    source_stream = BytesIO(f.read()) 
prs = Presentation(source_stream) 

first_slide = prs.slides[0] 
title = first_slide.shapes.title 
subtitle = first_slide.placeholders[1] 
title.text = 'Title' 
subtitle.text = "Subtitle" 

response = HttpResponse(content_type='application/vnd.ms-powerpoint') 
response['Content-Disposition'] = 'attachment; filename="sample.pptx"' 
prs.save(source_stream) 
ppt = source_stream.getvalue() 
source_stream.close() 
response.write(ppt) 
return response 

어떤 도움을 주셔서 감사합니다.

+0

그래서 무엇이 문제입니까? '.pptx'는 기본적으로 이름이 바뀐 .zip 파일입니다. 이 파일의 이름을'.zip'으로 변경하고 안에있는 파일을 수동으로 검사하십시오. – yedpodtrzitko

답변

1

IO에 문제가있는 것 같습니다. 단지 불필요한 자원을 사용

prs = Presentation('foo.pptx') 

메모리 기반 스트림으로 파일을 배치 :

제 산신

의해 대체 될 수있다.

글을 쓰는 동안, 당신은 그 원래의 (불필요한) 스트림에 글을 쓰고 있습니다. 나는 그것이 당신이 그것의 끝에 붙이고있는 seek(0)을하지 않았기 때문에 그것을 의심한다. 또한 개념적으로 재사용을 다루는 것이 더 복잡합니다.

저장을 위해 새로운 BytesIO 버퍼를 사용한다면 적절한 행동을 취할 것입니다. 오픈 된 것을 분리하고 수정하고 저장하기 때문에 더 나은 방법이기도합니다. 그런 다음 나중에 별도의 방법으로 고려할 수 있습니다.

첫 번째 BytesIO를 없애면 .pptx "파일"을 HTTP 응답으로 가져 오려면 저장 용으로 필요한 것입니다.

+0

안녕하세요, Scanny, 답변 해 주셔서 감사합니다. 귀하의 조언에 따라, 나는 "prs = Presentation ('foo.pptx')"로 시작하고 "prs.save (source_stream)"전에 "source_stream = BytesIO()"코드를 삽입합니다. 마지막으로 생성 된 파워 포인트가 완벽하게 작동합니다! –