我正在创建一个HTML模板来显示pdf文件的封面(第一页或用户可以选择一个)。我想Django创建封面图像自动无需额外上传
pdf文件使用Django Modelform上传。下面是我的代码结构
models.py
class Pdffile(models.Model):
pdf = models.FileField(upload_to='pdfdirectory/')
filename = models.CharField(max_length=20)
pagenumforcover = models.IntegerField()
coverpage = models.FileField(upload_to='coverdirectory/')
form.py
class PdffileForm(ModelForm):
class Meta:
model = Pdffile
fields = (
'pdf',
'filename',
'pagenumforcover',
)
views.py
def upload(request):
if request.method == 'POST':
form = PdffileForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('pdffilelist')
else:
form = PdffileForm()
return render(request, "uploadform.html", {'form': form})
def pdfcover(request, pk):
thispdf = get_object_or_404(Pdffile, pk=pk)
return render(request, 'pdfcover.html', {'thispdf': thispdf})
在“pdfcover.html”中,我想使用Django模板语言,以便为不同上传的pdf文件呈现不同的html。这就是为什么我要将图像文件保存到与pdf文件相同的列中
我不熟悉Python,不熟悉Django,显然也不熟悉堆栈溢出。我试过pdf2image和PyPDF2,我相信它们都可以工作,但我就是找不到正确的代码。如果你们能启发我,我会很感激的
在
pdf2image
包中有一个名为convert_from_path
的函数这是该函数的每个参数在包中的说明
因为
convert_from_path
被设计成能够将pdf中的每一页转换成图像,所以函数返回一个图像对象数组如果设置
output_folder
参数,则每个图像将从基本目录保存到该位置output_folder
在这种情况下必须是完整路径,例如'path/from/root/to/output_folder'
。如果不进行设置,则图像在转换时不会保存,仅保存在内存中默认情况下,如果不设置
output_file
参数,函数将生成一个随机格式的文件名,如0a15a918-59ba-4f15-90f0-2ed5fbd0c36c-1.ext
。虽然如果确实设置了文件名,因为此文件名用于转换多个pdf页面,但如果output_file
是'file_name'
,则每个文件的命名将从'file_name0001-1.ext'
开始请注意,如果设置
output_file
和output_folder
并尝试转换两个不同的pdf,则第二个pdf将覆盖第一个pdf的图像文件(如果它们位于同一目录中)下面是一些在问题中围绕您的代码建模的代码。此代码假定您已安装
pdf2image
。我在
pdf
文件字段中添加了一个内置的验证器,因为如果上传的不是pdf,否则代码就会崩溃我还为上传目录和文件格式创建了三个常量。如果您需要更改其中任何一个,那么代码的其余部分可以保持不变
另外,我假设您有保存文件的默认设置
settings.py
models.py
convert_pdf_to_image
是在Pdffile
模型的post_save
信号上运行的函数。它会在您的PdffileForm
保存在上载视图中后运行,以便我们可以从保存的pdf文件创建封面图像文件更改
dpi
将更改图像的质量。为了只转换一个页面,first_page
和last_page
参数是相同的。因为结果是一个数组,所以在本例中,我们获取cover_page_image
内列表中的第一个也是唯一一个元素对上载视图的微小更改
views.py
我不知道你的
upload.html
文件是什么样子的,但是我使用了下面的代码upload.html
以pdf为例
透过表格上载
生成的数据库记录
上传后生成的文件位置
最后说明:
因为文件字段有确保现有文件不会被覆盖的代码,所以
确保使用pdf文件字段文件名来命名封面,因为它几乎是完全唯一的
相关问题 更多 >
编程相关推荐