isr*_*kir 6 django reportlab pypdf
我写了一个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()
Run Code Online (Sandbox Code Playgroud)
我知道它是一个较旧的帖子,但我们可以使用html的embed标签来实现这种功能.例如:
<embed height="100%" width="100%" name="plugin" src="filename.pdf" type="application/pdf">
Run Code Online (Sandbox Code Playgroud)
因此,在您的情况下,您可以使用render将响应发送到响应:
return render_to_response("abc.html",{"filename":filename})
Run Code Online (Sandbox Code Playgroud)
并且在abc.html中,您可以将此文件名(带路径)放在embed标记中,如上所述.
希望这可以帮助.
除了将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
Run Code Online (Sandbox Code Playgroud)
我不确定我是否遵循。如果您希望将 PDF 内容发送到浏览器,您应该使用一个HttpResponse实例。您代码中的这一行
outputStream = file("document-output.pdf", "wb")
Run Code Online (Sandbox Code Playgroud)
不会用于将 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没有任何提示的情况下下载。
| 归档时间: |
|
| 查看次数: |
9856 次 |
| 最近记录: |