2010-09-22 24 views
6

Tôi đã viết một sáp nhập Pdf mà sáp nhập một tập tin gốc với một watermark.Làm cách nào để mở tệp PDF được tạo trong trình duyệt?

Điều tôi muốn làm bây giờ là mở tệp 'document-output.pdf' trong trình duyệt bằng chế độ xem Django. Tôi đã kiểm tra bài viết liên quan của Django, nhưng vì cách tiếp cận của tôi tương đối khác, tôi không trực tiếp tạo đối tượng PDF, sử dụng đối tượng phản hồi như "tệp" của nó. Vì vậy, tôi bị mất.

Vì vậy, làm cách nào tôi có thể thực hiện ở chế độ xem 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() 

Trả lời

3

Tôi không chắc chắn tôi làm theo. Nếu bạn muốn nội dung PDF được gửi đến trình duyệt, bạn nên sử dụng phiên bản HttpResponse. Dòng này trong mã của bạn

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

sẽ không phân phát nội dung PDF cho câu trả lời. Thay vào đó nó trông giống như tôi sẽ viết nội dung vào một tập tin cục bộ, mà không giống nhau.

Cập nhật

Dựa trên nhận xét:

Làm thế nào để gửi nội dung PDF sang một đối tượng HttpResponse vì nó sẽ mở ra trong trình duyệt, không phải là một tập tin đính kèm.

AFAIK (nếu có ai biết rõ hơn, hãy sửa tôi) điều này phụ thuộc vào trình duyệt.

Nếu bạn rời khỏi Content-Disposition = "attachment; filename=foo.pdf từ tiêu đề phản hồi, bạn có thể gửi nội dung đến trình duyệt mà không cần tên tệp cụ thể. Điều này khiến trình duyệt Firefox của tôi (3.6.10, Ubuntu Jaunty) hỏi tôi có muốn mở nó bằng chương trình không. Trên Chrome (6.0.472.62, Ubuntu Jaunty) tệp đã được tải xuống dưới dạng download.pdf mà không cần bất kỳ lời nhắc nào.

+0

Vâng, tôi biết. Trên thực tế đó là những gì tôi đang yêu cầu :) Cách gửi nội dung PDF đến một đối tượng HttpResponse vì nó sẽ mở trong trình duyệt, không phải là tệp đính kèm. – israkir

+0

@israkir: Đã cập nhật câu trả lời của tôi. Xem ở trên. –

8

Tôi biết một bài đăng cũ hơn nhưng chúng tôi có thể sử dụng thẻ nhúng html để triển khai loại chức năng này. Đối với ví dụ:

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

Vì vậy, trong trường hợp của bạn, bạn chỉ có thể gửi câu trả lời sử dụng trả cho phản ứng như:

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

và trong abc.html bạn có thể đặt tên tập tin này (với đường dẫn) trong thẻ nhúng, như đã đề cập ở trên.

Hy vọng điều này sẽ hữu ích.

+0

Thao tác này sẽ tải xuống tệp pdf thay vì hiển thị nó khi tải trong trình duyệt chrome. Làm thế nào để bạn làm cho nó chỉ hiển thị và không tải xuống cho đến khi được yêu cầu – flexxxit

6

Ngoài việc gửi PDF của bạn trở lại trình duyệt, bạn cũng có thể lưu một số chu kỳ bằng cách lưu hình mờ của bạn trong bộ đệm chuỗi.

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 'đính kèm' từ dòng này với Chris bình luận

response['Content-Disposition'] = 'attachment; filename=somefilename.pdf' 
Các vấn đề liên quan