2012-08-02 12 views
15

क्या उपयोगकर्ता को इसे देखने के लिए इसे डाउनलोड करने के बजाय, डीजेंगो दृश्य में पीडीएफ फ़ाइल दिखा सकता है?Django व्यू में पीडीएफ फ़ाइल कैसे दिखाएं

और यदि यह संभव है, तो यह कैसे किया जाएगा?

यह वही है मैं अब तक किया है - Simplistically

@login_required 
def resume(request, applicant_id): 

    #Get the applicant's resume 
    resume = File.objects.get(applicant=applicant_id) 
    fsock = open(resume.location, 'r') 
    response = HttpResponse(fsock, mimetype='application/pdf') 

    return response 

उत्तर

23

, यदि आप एक पीडीएफ फाइल है और आप एक Django दृश्य के माध्यम से उत्पादन करना चाहते हैं, तुम सब करने की जरूरत है में फ़ाइल की सामग्री डंप है प्रतिक्रिया और उपयुक्त mimetype के साथ भेजो।

def pdf_view(request): 
    with open('/path/to/my/file.pdf', 'r') as pdf: 
     response = HttpResponse(pdf.read(), mimetype='application/pdf') 
     response['Content-Disposition'] = 'inline;filename=some_file.pdf' 
     return response 
    pdf.closed 

आप शायद सिर्फ सामग्री-विन्यास निर्दिष्ट किए बिना प्रतिक्रिया लौट सकते हैं सीधे, लेकिन बेहतर है कि आपका इरादा इंगित करता है और यह भी आप फ़ाइल नाम सिर्फ मामले में उपयोगकर्ता यह बचाने का फैसला निर्दिष्ट अनुमति देता है।

इसके अलावा, ध्यान दें कि ऊपर दिया गया दृश्य परिदृश्य को संभाल नहीं करता है जहां फ़ाइल को खोला नहीं जा सकता है या किसी भी कारण से पढ़ा नहीं जा सकता है। चूंकि यह with के साथ किया गया है, यह कोई अपवाद नहीं उठाएगा, लेकिन आपको अभी भी कुछ प्रकार की प्रतिक्रिया वापस करनी होगी। आप बस Http404 या कुछ भी उठा सकते हैं, हालांकि।

+0

यह मेरे लिए काम नहीं करता है जब तक मैं 'बदल दिया है माइम प्रकार = में login_required आवश्यकता का समाधान नहीं करता 'आवेदन/pdf' 'contenttype = करने के लिए' आवेदन/pdf'' –

+2

content_type, यह भी pdf.closed वहाँ – amchugh89

+0

कोई प्रभाव नहीं है यह ठीक से पहले करीब फ़ाइल वापसी है ??? मुझे नहीं लगता। – azuax

1

ब्राउज़र पीडीएफ पाठक नहीं हैं (जब तक उनके पास उचित प्लगइन/एडन नहीं है)।

आप पीडीएफ को इसके बजाय HTML के रूप में प्रस्तुत करना चाहते हैं, जिसे from the backend या the frontend किया जा सकता है।

5

इनलाइन लें; अगर आप अपनी फाइल सर्वर से पढ़ना चाहते हैं। और यह भी, HttpResponse kwarg mimetypecontent_type ने ले लिया है:

from django.contrib.auth.decorators import login_required 
from django.http import HttpResponse 

class DisplayPDFView(View): 

    def get_context_data(self, **kwargs): # Exec 1st 
     context = {} 
     # context logic here 
     return context 

    def get(self, request, *args, **kwargs): 
     context = self.get_context_data() 
     response = HttpResponse(content_type='application/pdf') 
     response['Content-Disposition'] = 'inline; filename="worksheet_pdf.pdf"' # Can use attachment or inline 

     # pdf generation logic here 
     # open an existing pdf or generate one using i.e. reportlab 

     return response 

# Remove login_required if view open to public 
display_pdf_view = login_required(DisplayPDFView.as_view()) 

के साथ अपने स्वयं पीडीएफ पैदा करने के लिए:

(response['Content-Disposition'] = 'inline;filename=some_file.pdf') 

def pdf_view(request): 
    with open('/app/../Test.pdf', 'r') as pdf: 
     response = HttpResponse(pdf.read(),content_type='application/pdf') 
     response['Content-Disposition'] = 'filename=some_file.pdf' 
     return response 
    pdf.closed 
1

यहाँ वर्ग आधारित विचारों का उपयोग एक पीडीएफ प्रदर्शित करने के लिए एक विशिष्ट यूज-केस है reportlab Django project Docs on PDF Generation देखें।

क्रिस प्रैट की प्रतिक्रिया मौजूदा पीडीएफ खोलने का एक अच्छा उदाहरण दिखाती है।

6

यदि आप विंडोज मशीन पर काम कर रहे हैं तो पीडीएफ rbr के रूप में खोला जाना चाहिए।

def pdf_view(request): 
    with open('/path/to /name.pdf', 'rb') as pdf: 
     response = HttpResponse(pdf.read(),content_type='application/pdf') 
     response['Content-Disposition'] = 'filename=some_file.pdf' 
     return response 
+0

पीडीएफ खोलने और दिखाने के लिए 'आर' का उपयोग कर मेरे लिए काम किया। – yndolok

10

Django विशेष रूप से फ़ाइलों को वापस करने के लिए कक्षा है, FileResponse। यह फ़ाइलों को स्ट्रीम करता है, ताकि आपको इसे वापस करने से पहले पूरी फ़ाइल को स्मृति में पढ़ने की आवश्यकता न हो। ये रहा:

from django.http import FileResponse, Http404 

def pdf_view(request): 
    try: 
     return FileResponse(open('foobar.pdf', 'rb'), content_type='application/pdf') 
    except FileNotFoundError: 
     raise Http404() 

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

0

यह मेरे

import re, os 
import os 
from django.http import HttpResponse 
from django.views.decorators.csrf import csrf_exempt 
@csrf_exempt 
def export_auto_doc(request): 
    name = request.GET.get('name', "") 
    filename = "path/to/file"+name+".pdf" 
    try: 
     if not re.search("^[a-zA-Z0-9]+$",name): 
      raise ValueError("Filename wrong format") 
     elif not os.path.isfile(filename): 
      raise ValueError("Filename doesn't exist") 
     else: 
      with open(filename, 'r') as pdf: 
       response = HttpResponse(pdf.read(), content_type='application/pdf') 
       response['Content-Disposition'] = 'inline;filename='+name+'.pdf' 
       return response 
      pdf.closed 
    except ValueError as e: 
     HttpResponse(e.message) 
0

के लिए काम किया @ radtek के जवाब के बाद ऊपर मैं एक वर्ग आधारित दृश्य प्रदर्शन की जांच का फैसला किया। मैंने View का उपयोग करने की कोशिश की लेकिन इसमें get_context_data() विधि नहीं थी।

मैंने कुछ मार्गदर्शन के लिए here देखा। मैं BaseDetailView के लिए बस गया क्योंकि मैं केवल एक वस्तु प्रदर्शित करना चाहता था।

from django.http import FileResponse 
from django.shortcuts import get_object_or_404 
from django.views.generic.detail import BaseDetailView 

class DisplayPdfView(BaseDetailView): 
    def get(self, request, *args, **kwargs): 
     objkey = self.kwargs.get('pk', None) #1 
     pdf = get_object_or_404(Pdf, pk=objkey) #2 
     fname = pdf.filename() #3 
     path = os.path.join(settings.MEDIA_ROOT, 'docs\\' + fname)#4 
     response = FileResponse(open(path, 'rb'), content_type="application/pdf") 
     response["Content-Disposition"] = "filename={}".format(fname) 
     return response 

टीका

1 यह पंक्ति एक नामित तर्क pk यूआरएल दृश्य को फोन करके पारित कर दिया एक्सेस करता है।

2 इस लाइन वास्तविक पीडीएफ मॉडल वस्तु हो जाता है।

3 मैंने अपने मॉडल में एक फ़ाइल filename(self): return os.path.basename(self.file.name) परिभाषित किया ताकि मुझे फ़ाइल नाम और विस्तार प्राप्त करने में मदद मिल सके।

4 यह लाइन पूरी filepath हो जाता है। जैसा कि ऊपर जवाब में विस्तार से बताया

फिर फ़ाइल प्रतिक्रिया का उपयोग करें। पीडीएफ फ़ाइल

-1

पढ़ने के लिए rb का उपयोग करना भी याद रखें, मैं इसे वहां फेंक रहा हूं।

आप बस अपनी पीडीएफ फिर से शुरू अपनी स्थिर फाइलों में जोड़ सकते हैं।

यदि आप अपनी स्थिर फाइलों की सेवा के लिए व्हाइट शोर का उपयोग कर रहे हैं, तो आपको दृश्य बनाने की भी आवश्यकता नहीं है। बस स्थिर स्थान पर अपने फिर से शुरू करें।

मैं मेरा कहा, यहाँ यह है: https://www.jefferythewind.com/static/main/resume/TIm-D_Nice.pdf

चेतावनी: यह सवाल

संबंधित मुद्दे