2011-09-11 2 views
1

이없는 생성 정말 전형적인 :장고 피사 PDF 파일에 공백이에게 나는 PDF를 렌더링하는 장고와 내 코드를 사용하고

t = loader.get_template('back/templates/content/receipt.html') 
c = RequestContext(request, { 
          'pagesize': 'A4', 
          'invoice': invoice, 
          'plan': plan, 
          }) 

html = t.render(c) 
result = StringIO.StringIO() 
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result) 
if not pdf.err: 
    return HttpResponse(result.getvalue(), mimetype="application/pdf") 

그리고 receipt.html은 특별한 아무것도 :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <title>Squizzal Receipt</title> 
    <style type="text/css"> 
     @page { 
      size: {{pagesize}}; 
      margin: 1cm; 
      word-spacing 1cm; 
      @frame footer { 
       -pdf-frame-content: footerContent; 
       bottom: 0cm; 
       margin-left: 9cm; 
       margin-right: 9cm; 
       height: 1cm; 
      } 
     } 
    </style> 
</head> 
<body> 
    <h1>Your Receipt</h1> 
    <<SNIP>> 

하지만 pdf의 공백은 렌더링되지 않습니다. 모든 단어가 바로 옆에 있습니다. 난 정상적인 공백을 시도하고 "& nbsp"결과는 동일합니다. 예를 들어 위의 내용은 pdf에 "YourReceipt"로 표시됩니다.

피사의 명령 줄 버전을 사용하려고하면 단어 사이에 공백이있는 pdf 파일 만 생성됩니다.

의견이 있으십니까?

+0

t.render (c) .encode ("UTF-8")의 HTML 출력을 파일에 저장하고 파일을 명령 줄 버전으로 보내십시오. 그것은 무엇을 생산합니까? – akonsu

+0

html 파일은 예상대로이며, 그 파일을 cmd 라인 pisa에 전달하면 예상 된 결과가 생성됩니다. 지금은 장고 개발자를 사용하여 이것을 테스트하지만 아파치에서 wsgi로 테스트했습니다. 나는 이것에 영향을 줄 수있는 다른 어떤 것도 생각할 수 없다. – Mark

+0

pisa.pisaDocument() 결과를 파일에 저장하고 PDF 뷰어에서 파일을 열어보십시오. 괜찮 니? – akonsu

답변

0

akonsu 덕분에 문제는 Django의 HttpResponse가 처리되는 방식 (서버 쪽 또는 브라우저 쪽)으로 보입니다. 대신

return HttpResponse(result.getvalue(), mimetype="application/pdf") 

이용

:

resp = HttpResponse(result.getvalue(), mimetype="application/pdf") 
resp['Content-Disposition'] = 'attachment; filename=receipt.pdf' 
return resp 

이 적어도 공백없이 결과를 생성합니다. 왜 첫 번째 방법이 효과가 없었는지 전혀 몰랐습니다.

+0

달성하려는 효과는 무엇입니까? PDF를 인라인으로 표시해야합니까? 아니면 URL로 이동할 때 브라우저에서 "다른 이름으로 저장"대화 상자를 열어야합니까? BTW, 콘텐츠 길이 헤더를 설정 했습니까? 어쩌면 이것이 문제의 원인입니까? – akonsu

+2

@ Alanyst의 대답은 실제로 정확합니다. 문제는 Google 크롬의 PDF 뷰어가 pdf를 올바르게 렌더링하지 못하기 때문에 파일 다운로드를 강제 할 때 문제가 해결되지 않습니다. 콘텐츠 처리를 설정하고 다운로드를 강제하면 문제가 쉽게 해결됩니다. –

+0

@markels 난 당신의 솔루션을 사용하고 난 후에도 여전히 문제가 있습니까? – laycat

4

동일한 문제가있어서 브라우저에서 PDF를 강제 다운로드하지 않으려했습니다. 이것은 특정 플랫폼 문제로 판명되었습니다 : Microsoft 트루 타입 글꼴이 설치되어 있지 않으면 Google 크롬의 기본 PDF 뷰어 플러그인이 특정 Linux 배포판의 특정 문서에서 공백을 렌더링하지 못합니다. 자세한 내용은 http://www.google.com/support/forum/p/Chrome/thread?tid=7169b114e8ea33c7&hl=en을 참조하십시오.

내가 (당신의 배포판에 대한 조정, 이것은 우분투에 있던) 단순히 떠들썩한 파티에서 다음 명령을 실행하여이 고정 :

$ sudo apt-get install msttcorefonts 

(설치 과정에서 EULA에 동의)

$ fc-cache -fv 

Chrome을 다시 시작한 후 (중요!) 네이티브 PDF 뷰어는 공백이있는 PDF를 올바르게 표시합니다.