Django – создание PDF файла, созданного с помощью xhtml2pdf, на серверный диск

Вопрос:

Я пытаюсь написать сценарий, который сохранит pdf файл, созданный xhtml2pdf, непосредственно на сервере, не выполняя обычный маршрут запроса пользователю загрузить его на свой компьютер. Документы() – это модель, которую я пытаюсь сохранить, и переменные new_project и output_filename устанавливаются в другом месте.

            html = render_to_string(template, RequestContext(request, context)).encode('utf8')
result = open(output_filename, "wb")
pdf = CreatePDF(src=html, dest=results, path = "", encoding = 'UTF-8', link_callback=link_callback) #link callback was originally set to link_callback, defined below
result.close()
if not pdf.err:

new_doc=Documents()
new_doc.project=new_project
new_doc.posted_by=old_mess[0].from_user_fk.username
new_doc.documents = result
new_doc.save()

С этой конфигурацией, когда она достигает new_doc.save(), я получаю ошибку: объект “file” не имеет атрибута “_committed”

Кто-нибудь знает, как я могу это исправить? Благодарю!

Лучший ответ:

Поиграв с ним, я нашел рабочее решение. Проблема заключалась в том, что я не создавал новый документ, пока результат (pdf) все еще был открытым.

“+” необходимо было добавить в open(), чтобы файл pdf был доступен для чтения и записи, а не просто для записи.

Обратите внимание, что это сначала сохраняет PDF файл в другой папке (файлы). Если это не является желательным результатом для вашего приложения, вам нужно будет удалить его.

            html = render_to_string(template, RequestContext(request, context)).encode('utf8')
            results = StringIO()
            result = open("Files/"+output_filename, "w+b")
            pdf = CreatePDF(src=html, dest=results, path = "", encoding = 'UTF-8', link_callback=link_callback) #link callback was originally set to link_callback, defined below

            if not pdf.err:
                result.write(results.getvalue())
                new_doc=Documents()
                new_doc.project=new_project
                new_doc.documents.save(output_filename, File(result))
                new_doc.posted_by=old_mess[0].from_user_fk.username

                new_doc.save()
            result.close()

Оцените статью
TechArks.Ru
Добавить комментарий