Я пытаюсь сделать следующее:
- Получить PDF с URL
- Изменить его с помощью pdfrw
- Сохранить его в памяти как объект BytesIO obj
- Загрузить его в Django FileField через
Model.objects.create(form=pdf_file, name="Some name")
Моя проблема заключается в том, что при запуске метода create()
сохраняются все поля , за исключением для form
.
helpers.py
import io
import tempfile
from contextlib import contextmanager
import requests
import pdfrw
@contextmanager
def as_file(url):
with tempfile.NamedTemporaryFile(suffix='.pdf') as tfile:
tfile.write(requests.get(url).content)
tfile.flush()
yield tfile.name
def write_fillable_pdf(input_pdf_path, output_pdf_path, data_dict):
template_pdf = pdfrw.PdfReader(input_pdf_path)
## PDF is modified here
buf = io.BytesIO()
print(buf.getbuffer().nbytes). # Prints "0"!
pdfrw.PdfWriter().write(buf, template_pdf)
buf.seek(0)
return buf
views.py
from django.core.files import File
class FormView(View):
def get(self, request, *args, **kwargs):
form_url = 'http://some-pdf-url.com'
with as_file(form_url) as temp_form_path:
submitted_form = write_fillable_pdf(temp_form_path, temp_form_path, {"name": "John Doe"})
print(submitted_form.getbuffer().nbytes). # Prints "994782"!
FilledPDF.objects.create(form=File(submitted_form), name="Test PDF")
return render(request, 'index.html', {})
As Вы можете видеть, что print()
выдает два разных значения при заполнении BytesIO, что наводит меня на мысль, что увеличение размера означает, что в нем действительно есть данные. Есть ли причина, по которой он не сохраняется должным образом в моем экземпляре модели django? Кроме того, если кто-нибудь знает более эффективный способ сделать это, пожалуйста, дайте мне знать!