2010-09-22 22 views
6

मैंने एक पीडीएफ विलय लिखा है जो एक वॉटरमार्क के साथ एक मूल फ़ाइल विलय करता है।ब्राउज़र में जेनरेट की गई पीडीएफ फाइल कैसे खोलें?

अब मैं क्या करना चाहता हूं, ब्राउज़र में 'दस्तावेज़-आउटपुट.pdf' फ़ाइल को Django व्यू द्वारा खोलना है। मैंने पहले से ही Django के संबंधित लेखों की जांच की है, लेकिन चूंकि मेरा दृष्टिकोण अपेक्षाकृत अलग है, इसलिए मैं प्रतिक्रिया ऑब्जेक्ट का उपयोग अपनी "फ़ाइल" के रूप में सीधे पीडीएफ ऑब्जेक्ट नहीं बनाता, इसलिए मैं खो गया हूं।

तो, मैं 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() 

उत्तर

3

मुझे यकीन नहीं है कि मैं अनुसरण करता हूं। यदि आप ब्राउज़र में पीडीएफ सामग्री भेजना चाहते हैं तो आपको HttpResponse इंस्टेंस का उपयोग करना चाहिए। आपके कोड

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

प्रतिक्रिया में पीडीएफ सामग्री लिखने के लिए काम नहीं करेगा। इसके बजाय यह मुझे लगता है जैसे यह एक स्थानीय फ़ाइल में सामग्री लिख देगा, जो समान नहीं है।

अद्यतन

टिप्पणी के आधार पर: के रूप में यह नहीं अनुलग्नक के रूप में ब्राउज़र में खुलेगा,

कैसे एक HttpResponse वस्तु को पीडीएफ सामग्री भेजने के लिए।

AFAIK (यदि कोई बेहतर जानता है, मुझे सही करें) यह ब्राउज़र निर्भर है।

यदि आप प्रतिक्रिया शीर्षकों से Content-Disposition = "attachment; filename=foo.pdf छोड़ते हैं तो आप बिना किसी विशिष्ट फ़ाइल नाम के ब्राउज़र को सामग्री भेज सकते हैं। इससे मेरे फ़ायरफ़ॉक्स ब्राउज़र (3.6.10, उबंटू जौन्टी) ने मुझसे पूछा कि क्या मैं इसे प्रोग्राम का उपयोग करके खोलना चाहता हूं। क्रोम पर (6.0.472.62, उबंटू जौन्टी) फ़ाइल को बिना किसी संकेत के download.pdf के रूप में डाउनलोड किया गया।

+0

हाँ, मुझे पता है के साथ इस लाइन से 'लगाव'। असल में मैं यही पूछ रहा हूं :) एचटीपीआरस्पॉन्स ऑब्जेक्ट में पीडीएफ सामग्री कैसे भेजें क्योंकि यह ब्राउज़र में खुल जाएगा, न कि अटैचमेंट के रूप में। – israkir

+0

@israkir: मेरा उत्तर अपडेट किया गया। ऊपर देखो। –

8

मुझे इसकी एक पुरानी पोस्ट पता है लेकिन हम इस तरह की कार्यक्षमता को लागू करने के लिए एचटीएमएल के एम्बेड टैग का उपयोग कर सकते हैं। उदाहरण के लिए:

<embed height="100%" width="100%" name="plugin" src="filename.pdf" type="application/pdf"> 
अपने मामले में

तो, आप बस प्रतिक्रिया प्रस्तुत करना का उपयोग कर के रूप में जवाबी कार्रवाई के लिए भेज सकते हैं:

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

और abc.html में आप (पथ के साथ) इस फ़ाइल का नाम रख सकते हैं ऊपर वर्णित एम्बेड टैग में।

उम्मीद है कि इससे मदद मिलती है।

+0

यह क्रोम ब्राउज़र में लोड पर प्रदर्शित करने के बजाय पीडीएफ फ़ाइल डाउनलोड करता है। आप इसे केवल तब तक प्रदर्शित करते हैं जब तक अनुरोध नहीं किया जाता है – flexxxit

6

ब्राउज़र में अपने पीडीएफ को वापस भेजने के अलावा, आप स्ट्रिंग बफर में अपने वॉटरमार्क को स्टोर करके कुछ चक्र भी बचा सकते हैं।

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

निकालें क्रिस टिप्पणी

response['Content-Disposition'] = 'attachment; filename=somefilename.pdf' 
संबंधित मुद्दे