Pdf in django-rest-framework

Question:

I am trying to make pdf in Django

 from xhtml2pdf import pisa
 from django.http import HttpResponse
 from django.template.loader import get_template
 from django.template import Context 
 from rest_framework.views import APIView
 from .models import Brand

 class ABCView(APIView):
   def post(self, request,format=None):
    report = Brand.objects.all()
    template_path = 'profile_brand_report.html'

    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="Report.pdf"'

    context = {'report': report}
    template = get_template(template_path)
    html = template.render(Context(context))
    print (html)

    pisaStatus = pisa.CreatePDF(html, dest=response)

    return response

but I am getting an unexpected error I don’t know what I am doing wrong, I am getting this error

argument of type 'Context' is not iterable

or is there any other way to do it .thanks for help in advance

Asked By: Vivek Singh

||

Answers:

We don’t need to use a class based view for it. For simplicity we can use a function based view. Change your code as below.

from django.template.loader import render_to_string

def generate_pdf(request):
    report = Brand.objects.all()
    template_path = 'profile_brand_report.html'

    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="Report.pdf"'

    html = render_to_string(template_path, {'report': report})
    print (html)

    pisaStatus = pisa.CreatePDF(html, dest=response)

    return response 

We can also use wkhtmltopdf to generate PDF’s in django.
Read: https://learnbatta.com/blog/django-html-to-pdf-using-pdfkit-and-wkhtmltopdf-5/

Answered By: anjaneyulubatta505

I hope work this

def generate_pdf(data):
    buffer = BytesIO()
    p = canvas.Canvas(buffer, pagesize=letter)
    for row, item in enumerate(data):
        for col, value in enumerate(item.values()):
            p.drawString(col * 100 + 20, row * 30 + 20, str(value).encode('utf-8'))

    p.showPage()
    p.save()
    buffer.seek(0)
    pdf_output = buffer.getvalue()
    buffer.close()
    return pdf_output
Answered By: Music Factry