繁体   English   中英

如何将使用BytesIO创建的PDF文件添加到Django模型中的FileField中

[英]How to add PDF file created with BytesIO into a FileField in a model of Django

我可以在 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。

您可能需要在您的bufferseek(0) ,因为它以前被使用过,我不会感到惊讶缓冲区会在最后并导致在 Django 中保存一个空文件。

我相信你缺少的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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM