如何在浏览器中打开生成的PDF文件?

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)

Ank*_*wal 9

我知道它是一个较旧的帖子,但我们可以使用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标记中,如上所述.

希望这可以帮助.


Chr*_*ris 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
Run Code Online (Sandbox Code Playgroud)


Man*_*dan 3

我不确定我是否遵循。如果您希望将 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没有任何提示的情况下下载。