用 Django 打开 pdf 文件
Open pdf file with Django
我正在尝试将 Django 中的两个 pdf 文件与 PyPDF2 和 ReportLab 合并。我的看法如下:
@login_required
def export_to_pdf(request, user_id):
member = Member.objects.filter(user_id=user_id).values('user_id',
'user__first_name',
'user__last_name',
'company_name',
'vat_number',
'address',
'postcode',
'city',
'user__email',
'telephone',
'subscription__type__name',
'subscription__type__limit',
).annotate(num_calculations=Count('user__calculations'))[0]
company_address = "{}, {} {}".format(member['address'], member['postcode'], member['city'])
buffer = BytesIO()
# Create the PDF object, using the BytesIO object as its "file."
p = canvas.Canvas(buffer, pagesize=A4)
p.setFont('Helvetica-Bold', 8)
p.drawString(70, 765, "{}".format(member['company_name']))
p.drawString(70, 731, "{}".format(company_address))
p.drawString(70, 714, "{}".format(member['telephone']))
p.drawString(335, 697, "{}".format(member['vat_number']))
p.drawString(335, 697, "{}".format(member['vat_number']))
p.save()
buffer.seek(0)
new_pdf = PdfFileReader(buffer)
existing_pdf = PdfFileReader(open('master/files/file.pdf', "rb"))
page = existing_pdf.getPage(0)
page.mergePage(new_pdf.getPage(0))
output = PdfFileWriter()
output.addPage(page)
output_stream = open("master/files/new_file.pdf", "wb")
output.write(output_stream)
output_stream.close()
with open('master/files/new_file.pdf', 'r', encoding="Latin-1") as pdf:
response = HttpResponse(pdf.read(), content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename=some_file.pdf'
return response
项目树如下:
因此,我创建了新文件,然后打开了一个现有文件 file.pdf
,然后我合并了这两个文件。最后,我为输出创建了一个文件 new_file.pdf
.
工作正常,但问题出在返回的文件上。
如果我 运行 export_to_pdf
函数我应该得到 new_file.pdf
。我得到了那个文件,但是那个文件的内容只是我用
创建的
p = canvas.Canvas(buffer, pagesize=A4)
p.setFont('Helvetica-Bold', 8)
p.drawString(70, 765, "{}".format(member['company_name']))
p.drawString(70, 731, "{}".format(company_address))
p.drawString(70, 714, "{}".format(member['telephone']))
p.drawString(335, 697, "{}".format(member['vat_number']))
p.drawString(335, 697, "{}".format(member['vat_number']))
p.save()
合并后的文件没有内容file.pdf
。
但是如果我直接点击 new_file.pdf
打开它,我会得到它应该的一切。
对我做错了什么有什么建议吗?
我解决了。以防其他人遇到同样的问题。
我刚改了一行
with open('master/files/new_file.pdf', 'rb') as pdf:
因此我添加了 rb
而不是 r
。然后也不再需要编码。
我正在尝试将 Django 中的两个 pdf 文件与 PyPDF2 和 ReportLab 合并。我的看法如下:
@login_required
def export_to_pdf(request, user_id):
member = Member.objects.filter(user_id=user_id).values('user_id',
'user__first_name',
'user__last_name',
'company_name',
'vat_number',
'address',
'postcode',
'city',
'user__email',
'telephone',
'subscription__type__name',
'subscription__type__limit',
).annotate(num_calculations=Count('user__calculations'))[0]
company_address = "{}, {} {}".format(member['address'], member['postcode'], member['city'])
buffer = BytesIO()
# Create the PDF object, using the BytesIO object as its "file."
p = canvas.Canvas(buffer, pagesize=A4)
p.setFont('Helvetica-Bold', 8)
p.drawString(70, 765, "{}".format(member['company_name']))
p.drawString(70, 731, "{}".format(company_address))
p.drawString(70, 714, "{}".format(member['telephone']))
p.drawString(335, 697, "{}".format(member['vat_number']))
p.drawString(335, 697, "{}".format(member['vat_number']))
p.save()
buffer.seek(0)
new_pdf = PdfFileReader(buffer)
existing_pdf = PdfFileReader(open('master/files/file.pdf', "rb"))
page = existing_pdf.getPage(0)
page.mergePage(new_pdf.getPage(0))
output = PdfFileWriter()
output.addPage(page)
output_stream = open("master/files/new_file.pdf", "wb")
output.write(output_stream)
output_stream.close()
with open('master/files/new_file.pdf', 'r', encoding="Latin-1") as pdf:
response = HttpResponse(pdf.read(), content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename=some_file.pdf'
return response
项目树如下:
因此,我创建了新文件,然后打开了一个现有文件 file.pdf
,然后我合并了这两个文件。最后,我为输出创建了一个文件 new_file.pdf
.
工作正常,但问题出在返回的文件上。
如果我 运行 export_to_pdf
函数我应该得到 new_file.pdf
。我得到了那个文件,但是那个文件的内容只是我用
p = canvas.Canvas(buffer, pagesize=A4)
p.setFont('Helvetica-Bold', 8)
p.drawString(70, 765, "{}".format(member['company_name']))
p.drawString(70, 731, "{}".format(company_address))
p.drawString(70, 714, "{}".format(member['telephone']))
p.drawString(335, 697, "{}".format(member['vat_number']))
p.drawString(335, 697, "{}".format(member['vat_number']))
p.save()
合并后的文件没有内容file.pdf
。
但是如果我直接点击 new_file.pdf
打开它,我会得到它应该的一切。
对我做错了什么有什么建议吗?
我解决了。以防其他人遇到同样的问题。
我刚改了一行
with open('master/files/new_file.pdf', 'rb') as pdf:
因此我添加了 rb
而不是 r
。然后也不再需要编码。