2015-03-07 4 views
0

Я пытаюсь и делаю некоторые тесты для вывода PDF-файлов с помощью Django. Я использую проект xhtml2pdf, установленный с pip.Django xhtml2pdf «HttpResponse» не имеет интерфейса буфера

Я посмотрел пример отправки PDF-файла в браузер и выполнил его, но при попытке создать мой шаблон появляется ошибка. Она гласит:

'HttpResponse' does not have the buffer interface 

мой взгляд код следующий:

def generate_pdf(request): 

    from xhtml2pdf import pisa 
    from person.views import alumn_list 

    html = alumn_list(request, 12, 0) # This function returns a render('alumn_list.html) 

    pdfFile = open(os.path.join(base.TEMPLATE_DIRS[0], 'test.pdf'), 'w+b') 
    pisaStatus = pisa.CreatePDF(html, dest=pdfFile) # The errors happens here 

    pdfFile.seek(0) 
    pdf = pdfFile.read() 
    pdfFile.close() 
    return HttpResponse(pdf, content_type='application/pdf') 

Мой шаблон следующий:

{% extends "alumns.html" %} 
{% load i18n %} 

{% block extra_css %} 
    <style> 
    @page { 
     size: letter portrait; 
     @frame header_frame {   /* Static frame */ 
      -pdf-frame-content: header_content; 
      left: 50pt; width: 512pt; top: 50pt; height: 40pt; 
     } 
     @frame col1_frame {    /* Content frame 1 */ 
      left: 44pt; width: 445pt; top: 90pt; height: 632pt; 
      text-align:center; 
     } 

     @frame footer_frame {   /* Static frame */ 
      -pdf-frame-content: footer_content; 
      left: 50pt; width: 512pt; top: 772pt; height: 20pt; 
     } 
    } 
    </style> 
{% endblock extra_css %} 

{% block title %} 
    {% trans "Alumn list" %} 
{% endblock title %} 

{% block page_title %} 
    {% trans "Alumn list" %} 
{% endblock page_title %} 

{% block content %} 
    <table class="infoTable"> 
     {% csrf_token %} 
     {% for index in "12" %} 
     <caption {% ifequal index "2" %}align="bottom"{% endifequal%}> 
      <a href="{{hrefs.0}}" class="pager">&lt;&lt; {% trans "Previous" %}</a> 
      <a href="{{hrefs.1}}" class="pager">{% trans "Next" %} &gt;&gt;</a> 
     </caption> 
     {% endfor %} 

     <thead> 
      <th>{% trans "ID" %}</th> 
      <th>{% trans "Name" %}</th> 
     </thead> 
    {% for alumn in alumnList %} 
     <tr id="alumn{{alumn.alumnId}}"> 
      <td>{{ alumn.alumnId }}</td> 
      <td><button class="profileAlumn" alumn_id="{{alumn.alumnId}}">{% trans "Profile" %}</button></td> 
      <td><button class="deleteAlumn" alumn_id="{{alumn.alumnId}}">{% trans "Delete" %}</button></td> 
     </tr> 
    {% endfor %} 
    </table> 
{% endblock content %} 

Я не знаю, как исправить эту ошибку. Я искал эту ошибку, но появилось только три неоднозначных страницы результатов, и никто не ссылался на HttpResponse.

Пожалуйста, помогите. Я не знаю, что я делаю неправильно.

Это также помогло бы мне, если бы у кого-то была какая-то ссылка, где я могу узнать, как сделать pdf-файл из каждого отображаемого HTML-шаблона из моего webapp.

Благодаря очень заранее

+0

То, что вы показали, не является допустимой функцией просмотра. Пожалуйста, предоставьте реальный. – JuniorCompressor

+0

@JuniorCompressor Я сейчас делаю. – madtyn

+0

@JuniorCompressor Я думаю, что это делается прямо сейчас. Скажите мне, если вы найдете что-то не так, кроме этого – madtyn

ответ

1

alumn_list вид. Таким образом, он возвращает объект HttpResponse. Но вам нужно передать строку байта в pisa.CreatePDF, который является содержимым ответа. Таким образом, вы могли бы сделать следующее:

pisaStatus = pisa.CreatePDF(html.content, dest=pdfFile) 
+0

Теперь работает. Это действительно помогло. Спасибо! :-) – madtyn

Смежные вопросы