Django 3.2 как преобразовать загруженный pdf файл в файл изображения и сохранить в соответствующий столбец в базе данных?
У меня есть следующий код, который я использовал в Django 3.2, который работает нормально, за исключением 1 пункта:
models.py
from django.db import models
from django.core.validators import MaxValueValidator, MinValueValidator
# Create your models here.
from django.core.validators import FileExtensionValidator
from django.db.models.signals import post_save, pre_save
from pdf2image import convert_from_path
from django.conf import settings
import os
COVER_PAGE_DIRECTORY = 'library_app/coverdirectory/'
PDF_DIRECTORY = 'library_app/pdfdirectory/'
COVER_PAGE_FORMAT = 'jpg'
# this function is used to rename the pdf to the name specified by filename field
def set_pdf_file_name(instance, filename):
return os.path.join(PDF_DIRECTORY, '{}.pdf'.format(instance.filename))
# not used in this example
def set_cover_file_name(instance, filename):
return os.path.join(COVER_PAGE_DIRECTORY, '{}.{}'.format(instance.filename, COVER_PAGE_FORMAT))
class Pdffile(models.Model):
# validator checks file is pdf when form submitted
pdf = models.FileField(
upload_to=set_pdf_file_name,
validators=[FileExtensionValidator(allowed_extensions=['pdf'])]
)
filename = models.CharField(max_length=50)
pagenumforcover = models.PositiveIntegerField(default=1, validators=[MinValueValidator(1), MaxValueValidator(1000)])
coverpage = models.FileField(blank=True, upload_to=set_cover_file_name)
def convert_pdf_to_image(sender, instance, created, **kwargs):
if created:
# check if COVER_PAGE_DIRECTORY exists, create it if it doesn't
# have to do this because of setting coverpage attribute of instance programmatically
cover_page_dir = os.path.join(settings.MEDIA_ROOT, COVER_PAGE_DIRECTORY)
if not os.path.exists(cover_page_dir):
os.mkdir(cover_page_dir)
# convert page cover (in this case) to jpg and save
cover_page_image = convert_from_path(
pdf_path=instance.pdf.path,
dpi=50,
first_page=instance.pagenumforcover,
last_page=instance.pagenumforcover,
fmt=COVER_PAGE_FORMAT,
output_folder=cover_page_dir,
)[0]
# get name of pdf_file
pdf_filename, extension = os.path.splitext(os.path.basename(instance.pdf.name))
new_cover_page_path = '{}.{}'.format(os.path.join(cover_page_dir, pdf_filename), COVER_PAGE_FORMAT)
# rename the file that was saved to be the same as the pdf file
os.rename(cover_page_image.filename, new_cover_page_path)
# get the relative path to the cover page to store in model
new_cover_page_path_relative = '{}.{}'.format(os.path.join(COVER_PAGE_DIRECTORY, pdf_filename), COVER_PAGE_FORMAT)
instance.coverpage = new_cover_page_path_relative
# call save on the model instance to update database record
instance.save()
post_save.connect(convert_pdf_to_image, sender=Pdffile)
Когда я создаю объект, то создается jpg. Проблема в том, что когда я открываю экземпляр объекта в админ панели django и меняю Pagenumforcover на что-то другое, он обновляет само число, но новое целое число не вызывает генерацию новой страницы обложки, или если я удалю текущую страницу обложки и сохраню, то она не будет автоматически генерировать новую страницу обложки.
.
Буду благодарен за помощь.
Я пытался создать Django==3.2 Doc_app, в котором из панели администратора Django я загружаю pdf и указываю Pagenumforcover (PositiveIntegerField) и сохраняю его, после чего автоматически создается файл coverpage (jpg) в качестве титульной страницы и сохраняется вместе с загруженным pdf файлом. что работает нормально до сих пор. Проблема в том, что когда я открываю сохраненный объект в панели администратора django и изменяю Pagenumforcover или удаляю pagecover и сохраняю, то он не будет автоматически генерировать pagecover.