【问题标题】:Django - Save Canvas object as a PDF-File to FileFieldDjango - 将 Canvas 对象作为 PDF 文件保存到 FileField
【发布时间】:2018-07-03 01:07:53
【问题描述】:

(如何)可以将画布对象另存为 FileField 中的 PDF 文件吗?

https://docs.djangoproject.com/en/2.0/howto/outputting-pdf/#outputting-pdfs-with-django

views.py

from django.views.generic.edit import FormView
from reportlab.pdfgen import canvas

class SomeView(FormView):

    form_class = SomeForm
    template_name = 'sometemplate.html'


    def form_valid(self, form):

        item = form.save(commit=False)

        # create PDF
        filename = "somefile.pdf"
        p = canvas.Canvas(filename)
        p.drawString(100, 100, "Hello world.")
        p.showPage()
        p.save()

        # this will not work, but i hope there is another way
        # Error: 'Canvas' object has no attribute '_committed'
        item.file = p

        # save form
        item.save()

        return super(SomeView, self).form_valid(form)

Traceback:(要长粘贴所有)

[...]

Exception Type: AttributeError at /return/
Exception Value: 'Canvas' object has no attribute '_committed'

如果需要更多信息,请告诉我!

【问题讨论】:

  • 你有正确的进口吗?即from reportlab.pdfgen import canvas 发布您收到的错误的回溯。
  • 我添加了更多信息

标签: django django-forms reportlab


【解决方案1】:

试试:

def some_view(request):
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'

    p = canvas.Canvas(response)
    p.drawString(100, 100, "Hello world.")
    p.showPage()
    p.save()

    return response

【讨论】:

  • 这将返回一个 HttpResponse(用于下载)并且不会将文件保存在 models.FileField 中
【解决方案2】:

这并不理想,但它可以将文件(临时)写入磁盘,然后将其保存在 FileField 中(之后需要删除临时文件,代码中没有)

from reportlab.pdfgen import canvas
from django.core.files import File
import codecs

class SomeView(FormView):

    form_class = SomeForm
    template_name = 'sometemplate.html'


    def form_valid(self, form):

        item = form.save(commit=False)

        # create PDF
        filename = "somefile.pdf"
        p = canvas.Canvas(filename)
        p.drawString(100, 100, "Hello world.")
        p.showPage()
        p.save()

        with codecs.open('somefile.pdf', "r",encoding='utf-8', errors='ignore') as f:   
           item.file.save('somefile.pdf',File(f))

        # save form
        item.save()

        return super(SomeView, self).form_valid(form)

【讨论】:

    猜你喜欢
    • 2020-05-27
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2021-01-06
    相关资源
    最近更新 更多