kftb
kftb

Reputation: 127

Django Change File name in PDF export

I found this handy code in the Django Docs:

from reportlab.pdfgen import canvas
from django.http import HttpResponse

    def some_view(request):
        # Create the HttpResponse object with the appropriate PDF headers.
        response = HttpResponse(content_type='application/pdf')
        response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'

        # Create the PDF object, using the response object as its "file."
        p = canvas.Canvas(response)

        # Draw things on the PDF. Here's where the PDF generation happens.
        # See the ReportLab documentation for the full list of functionality.
        p.drawString(100, 100, "Hello world.")

        # Close the PDF object cleanly, and we're done.
        p.showPage()
        p.save()
        return response

I would like to pass a variable to the function as variable name, but cannot figure it out (though I am sure it is super easy).

Anyone have an idea?

Thanks so much!

Upvotes: 2

Views: 3308

Answers (3)

Laurent Lyaudet
Laurent Lyaudet

Reputation: 948

If you want to force viewing the PDF in browser with given filename but without automatic download, you can use "inline" instead of "attachment":

response["Content-Disposition"] = f'inline; filename="{file_name}"'

Upvotes: 0

Vijesh Venugopal
Vijesh Venugopal

Reputation: 1641

Hope it might helps you:

Add one more argument named "name" to the view "some_view" and replace the filename with the argument value.

def hello_pdf(request, name):

# Create the HttpResponse object with the appropriate PDF headers.
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=%s.pdf'% name

temp = StringIO()

# Create the PDF object, using the StringIO object as its "file."
p = canvas.Canvas(temp)

# Draw things on the PDF. Here's where the PDF generation happens.
# See the ReportLab documentation for the full list of functionality.
p.drawString(100, 100, "Hello world.")

# Close the PDF object cleanly.
p.showPage()
p.save()

# Get the value of the StringIO buffer and write it to the response.
response.write(temp.getvalue())
return response

Check the name argument replacing the filename in the 4th line of code. Also don't forget to update the urls.py like below:

 url(r'^(?P<name>\w+)/$', 'app.some_view')

After all pass the filename you wish to replace with url like below:

http://yourwebsite.com/name-of-file/

Upvotes: 0

Konstantin Moiseenko
Konstantin Moiseenko

Reputation: 444

filename="somefilename.pdf" there is place where you can determine your filename. You can use it as:

filename = 'somefilename.pdf'
response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)

Upvotes: 7

Related Questions