如何显示在Django查看PDF文件?(How to show a PDF file in a Dj

2019-06-17 15:07发布

是否有可能显示Django的查看PDF文件,而不是使用户必须下载它,看它?

如果可能的话,将如何做到呢?

这是我迄今为止 -

@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

Answer 1:

简单地说,如果你有一个PDF文件,并希望将其输出通过Django视图,所有你需要做的是转储文件内容到响应,并与相应的MIME类型发送。

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什么的,虽然。



Answer 2:

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服务器常规配置之外的这些文件。



Answer 3:

如果您在Windows机器PDF工作必须打开为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


Answer 4:

取出内嵌; 如果你想从服务器读取文件。 而且,在HttpResponse kwarg mimetype已经换成content_type

(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


Answer 5:

继@ radtek的回答上面我决定调查基于类的视图显示。 我试图用View ,但它没有get_context_data()方法。

我看了这里的一些指导。 我定居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由url调用视图通过。

2此行得到实际PDF模型对象。

3我定义的方法filename(self): return os.path.basename(self.file.name)在我的模型,以帮助我得到的只是文件名和扩展。

4此行得到完整的文件路径。

然后使用响应文件在上面的答案解释。 还记得使用rb来阅读PDF文件



Answer 6:

下面是一个典型的用例显示使用基于类的视图的PDF:

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())

对于ReportLab的生成自己的PDF看到的PDF生成Django项目文档 。

克里斯·普拉特的响应显示打开PDF文件存在一个很好的例子。



Answer 7:

浏览器是不是PDF阅读器(除非他们有适当的插件/插件)。

您可能要渲染的PDF作为HTML代替,这是可以做到从后端或前端 。



Answer 8:

它为我工作

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)


Answer 9:

我只是扔了这一点那里。

你可以简单的PDF简历添加到您的静态文件。

如果您使用的白噪声,以满足您的静态文件,那么你甚至不需要做出视图。 就在这时,在静止位置访问你的简历。

我说我的,那就是: https://www.jefferythewind.com/static/main/resume/TIm-D_Nice.pdf

警告:这不解决login_required的问题要求



Answer 10:

要做到这一点最简单的方法可能是在模板中的锚。 例如,如果您使用的是Django的模板引擎(如谁搜索这个大多数人可能是),只是充当它通过锚静态文件。

在您的模板将包含一个链接到文件,添加在最高层

{% load static %}

然后,无论你要链接到您的PDF,把

<a href="{% static 'relative/path/file.pdf' %}">Click me</a>

第一行告诉Django在配置静态文件的目录看settings.py 。 您在锚标记使用的路径是相对于任何你配置为静态目录的目录settings.py 。 当你点击链接呈现的,它应该在你的浏览器中显示PDF,只要你有正确的径处理静态文件。



文章来源: How to show a PDF file in a Django view?