2010-09-22 41 views
6

He escrito una fusión Pdf que combina un archivo original con una marca de agua.¿Cómo abrir un archivo PDF generado en el navegador?

Lo que quiero hacer ahora es abrir el archivo 'document-output.pdf' en el navegador mediante una vista de Django. Ya revisé los artículos relacionados de Django, pero dado que mi enfoque es relativamente diferente, no creo directamente el objeto PDF, utilizando el objeto de respuesta como su "archivo", así que estoy un poco perdido.

Entonces, ¿cómo puedo hacer está en una vista de 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() 

Respuesta

3

No estoy seguro de que yo siga. Si desea que el contenido PDF se envíe al navegador, debe usar una instancia HttpResponse. Esta línea en su código

outputStream = file("document-output.pdf", "wb") 

no servirá para escribir el contenido del PDF en la respuesta. En cambio, me parece que escribirá los contenidos en un archivo local, que no es lo mismo.

actualización

Basado en comentario:

cómo enviar contenido PDF a un objeto HttpResponse, ya que se abrirá en el navegador, no como un archivo adjunto.

AFAIK (si alguien sabe mejor, corrígeme) esto depende del navegador.

Si omite el Content-Disposition = "attachment; filename=foo.pdf de los encabezados de respuesta, puede enviar el contenido al navegador sin un nombre de archivo específico. Esto provocó que mi navegador Firefox (3.6.10, Ubuntu Jaunty) me preguntara si quería abrirlo usando un programa. En Chrome (6.0.472.62, Ubuntu Jaunty), el archivo se descargó como download.pdf sin ninguna indicación.

+0

Sí, lo sé. En realidad, eso es lo que estoy pidiendo :) Cómo enviar contenido PDF a un objeto HttpResponse ya que se abrirá en el navegador, no como un archivo adjunto. – israkir

+0

@israkir: Actualicé mi respuesta. Véase más arriba. –

8

Sé que es una publicación anterior, pero podemos utilizar la etiqueta de inserción de html para implementar este tipo de funcionalidad. Por ejemplo:

<embed height="100%" width="100%" name="plugin" src="filename.pdf" type="application/pdf"> 

Así, en su caso, sólo tiene que enviar la respuesta utilizando rendir a la respuesta:

return render_to_response("abc.html",{"filename":filename}) 

y en el abc.html usted puede poner este nombre de archivo (con la ruta) en la etiqueta de inserción, como se mencionó anteriormente.

Espero que esto ayude.

+0

Esto descarga el archivo pdf en lugar de mostrarlo al cargarlo en el navegador Chrome. ¿Cómo se hace solo mostrar y no descargar hasta que se solicite? – flexxxit

6

Además de enviar su PDF de vuelta al navegador, también puede guardar algunos ciclos almacenando su marca de agua en un búfer de cadena.

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 
1

remove 'apego' de esta línea con Chris comentario

response['Content-Disposition'] = 'attachment; filename=somefilename.pdf' 
Cuestiones relacionadas