我可以在 Django 應用程式中使用 reportlab 創建一個 PDF 檔案。但是,我無法將其添加到模型中的 FileField 中。我想知道如何將 io.BytesIO 資料傳輸到 Django 中的 FileField 中。
這是我的 views.py 的摘要。
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.pdfbase import pdfmetrics
buffer = io.BytesIO()
cc = canvas.Canvas(buffer, pagesize=A4)
# describe something
font_name = "HeiseiKakuGo-W5"
cc.registerFont(UnicodeCIDFont(font_name))
cc.setFont(font_name, 7)
cc.drawString(65*mm, 11*mm, 'test')
cc.showPage()
cc.save()
buffer.seek(0)
exampleObject= get_object_or_404(SomeModel, pk=self.kwargs['pk'])
exampleObject.exampleFileField.save('test.pdf', File(buffer)) # here! this sentence doesn't work.
exampleObject.save()
return FileResponse(buffer, as_attachment=True, filename='test.pdf')
關鍵是下面的句子不起作用。我認為“檔案(緩沖區)”不合適。
exampleObject.exampleFileField.save('test.pdf', File(buffer))
盡管在目錄中創建 pdf 檔案作為臨時檔案后,我曾嘗試將 pdf 保存到 FileField 中,但我更喜歡使用 io.BytesIO。
uj5u.com熱心網友回復:
你可能需要seek(0)在你的buffer,因為它以前被使用過,我不會驚訝緩沖區會在最后并導致在 Django 中保存一個空檔案。
uj5u.com熱心網友回復:
我相信你的失蹤 buffer.get_value()
我也使用ContentFile而不是File雖然不確定它是否有必要。
我剛剛測驗了以下代碼段,它使用 reportlab==3.5.32
import io
from django.core.files.base import ContentFile
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from my_app.models import MyModel
buffer = io.BytesIO()
canv = canvas.Canvas(buffer, pagesize=A4)
canv.drawString(100, 400, "test")
canv.save()
pdf = buffer.getvalue()
buffer.close()
my_object = MyModel.objects.latest("id")
my_object.file_field.save("test.pdf", ContentFile(pdf))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/327213.html
