我编写了一个Pdf合并程序,它将原始文件与水印合并。
我现在要做的是通过Django视图在浏览器中打开'document-output.pdf'文件。我已经检查了Django的相关文章,但由于我的方法相对不同,我不直接创建PDF对象,使用响应对象作为其“文件”。所以我有点迷失。
那么,我该怎么做才能进入Django视图?
from pyPdf import PdfFileWriter, PdfFileReader
from reportlab.pdfgen.canvas import Canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
output = PdfFileWriter()
input = PdfFileReader(file('file.pdf', 'rb'))
# get number of pages
num_pages = input.getNumPages()
# register new chinese font
pdfmetrics.registerFont(TTFont('chinese_font','/usr/share/fonts/truetype/mac/LiHeiPro.ttf'))
# generate watermark on the fly
pdf = Canvas("watermark.pdf")
pdf.setFont("chinese_font", 12)
pdf.setStrokeColorRGB(0.5, 1, 0)
pdf.drawString(10, 830, "你好")
pdf.save()
# put on watermark
watermark = PdfFileReader(file('watermark.pdf', 'rb'))
page1 = input.getPage(0)
page1.mergePage(watermark.getPage(0))
# add processed pdf page
output.addPage(page1)
# then, add rest of pages
for num in range(1, num_pages):
output.addPage(input.getPage(num))
outputStream = file("document-output.pdf", "wb")
output.write(outputStream)
outputStream.close()
答案 0 :(得分:9)
我知道它的帖子较旧,但我们可以使用html的embed标签来实现这种功能。例如:
<embed height="100%" width="100%" name="plugin" src="filename.pdf" type="application/pdf">
因此,在您的情况下,您可以使用render将响应发送到响应:
return render_to_response("abc.html",{"filename":filename})
并且在abc.html中,您可以将此文件名(带路径)放在embed标记中,如上所述。
希望这有帮助。
答案 1 :(得分:6)
除了将PDF发送回浏览器之外,您还可以通过将水印存储在字符串缓冲区中来节省一些周期。
from pyPdf import PdfFileWriter, PdfFileReader
from reportlab.pdfgen.canvas import Canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from django.http import HttpResponse
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
def some_view(request):
output = PdfFileWriter()
input = PdfFileReader(file('file.pdf', 'rb'))
#create response object
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=somefilename.pdf'
# get number of pages
num_pages = input.getNumPages()
#register the font
pdfmetrics.registerFont(TTFont('chinese_font','/usr/share/fonts/truetype/mac/LiHeiPro.ttf'))
# generate watermark on the fly
buffer = StringIO() # create string buffer for PDF
pdf = Canvas(buffer)
pdf.setFont("chinese_font", 12)
pdf.setStrokeColorRGB(0.5, 1, 0)
pdf.drawString(96, 26, "88888")
pdf.save()
# put on watermark from buffer
watermark = PdfFileReader(buffer)
page1 = input.getPage(0)
page1.mergePage(watermark.getPage(0))
# add processed pdf page
output.addPage(page1)
#stream to browser
outputStream = response
output.write(response)
outputStream.close()
return response
答案 2 :(得分:3)
我不确定我会效仿。如果您希望将PDF内容发送到浏览器,则应使用HttpResponse
实例。代码中的这一行
outputStream = file("document-output.pdf", "wb")
不会将PDF内容写入响应。相反,我认为它会将内容写入本地文件,这是不一样的。
<强>更新强>
基于评论:
如何将PDF内容发送到HttpResponse对象,因为它将在浏览器中打开,而不是作为附件。
AFAIK(如果有人知道更好,请更正),这取决于浏览器。
如果从响应标题中省略Content-Disposition = "attachment; filename=foo.pdf
,则可以将内容发送到浏览器而不使用特定文件名。这促使我的Firefox浏览器(3.6.10,Ubuntu Jaunty)问我是否想要使用程序打开它。在Chrome(6.0.472.62,Ubuntu Jaunty)上,文件已下载为download.pdf
而没有任何提示。
答案 3 :(得分:1)
删除&#39;附件&#39;从这一行与Chris评论
response['Content-Disposition'] = 'attachment; filename=somefilename.pdf'