Как в django сгенерировать файл pdf из шаблона django, сохранив стиль css?
Я создал pdf файл с помощью шаблона Django. В шаблоне все CSS, которые были применены, не отображаются в сгенерированном pdf.
Вот код, который я использовал :
from io import BytesIO
from xhtml2pdf import pisa
from django.template.loader import get_template
from django.http import HttpResponse
from django.shortcuts import render
def home(request):
pdf = render_to_pdf("abc.html")
return HttpResponse(pdf, content_type='application/pdf')
def render_to_pdf(template_src, context_dict={}):
template = get_template(template_src)
html = template.render(context_dict)
result = BytesIO()
pdf = pisa.pisaDocument(BytesIO(html.encode("ISO-8859-1")), result)
if not pdf.err:
return HttpResponse(result.getvalue(), content_type='application/pdf')
else
return None
from django.core.files import ContentFile
Если у вас уже есть файл webp, прочитайте файл webp, поместите его в ContentFile()
с буфером (что-то вроде io.BytesIO
). Затем вы можете приступить к сохранению объекта ContentFile()
в модель. Не забудьте обновить поле модели, и сохранить модель!
https://docs.djangoproject.com/en/4.1/ref/files/file/
Альтернатива
"django-webp-converter - это приложение Django, которое прямолинейно конвертирует статические изображения в WebP изображения, возвращаясь к исходному статическому изображению для неподдерживаемых браузеров."
.
У него также могут быть некоторые возможности сохранения.
https://django-webp-converter.readthedocs.io/en/latest/
Причина
Вы также сохраняете в неправильном порядке, правильный порядок вызова super().save()
- в конце.
Отредактированное и проверенное решение:
from django.core.files import ContentFile
from io import BytesIO
def save(self, *args, **kwargs):
#if not self.pk: #Assuming you don't want to do this literally every time an object is saved.
img_io = BytesIO()
im = Image.open(self.image).convert('RGB')
im.save(img_io, format='WEBP')
name="this_is_my_webp_file.webp"
self.image = ContentFile(img_io.getvalue(), name)
super(Banner, self).save(*args, **kwargs) #Not at start anymore
hello сделайте это следующим образом:
...
from django.db.models.signals import post_save
from django.dispatch import receiver
class Banner(models.Model):
image = models.ImageField(upload_to='banner')
device_size = models.CharField(max_length=20,choices=Banner_Device_Choice)
@receiver(post_save, sender=Banner)
def create_webp(sender, instance, created, **kwargs):
path = instance.image.path
if instance.image.path[-4:] !=webp:
im = Image.open(path).convert('RGB')
extention = instance.image.path.rsplit(".",2)[1]
file_name = path.replace(extention,"webp")
im.save(file_name, 'webp')
instance.image.path = file_name
instance.save()