41

ユーザーがPDFファイルをダウンロードして表示するのではなく、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
4

11 に答える 11

37

簡単に言うと、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

おそらく、Content-Disposition を指定せずに応答を直接返すこともできますが、その方が意図をよりよく示しており、ユーザーがファイルを保存することを決定した場合に備えて、ファイル名を指定することもできます。

また、上記のビューは、何らかの理由でファイルを開いたり読み取ったりできないシナリオを処理しないことに注意してください。で完了してwithいるため、例外は発生しませんが、何らかの応答を返す必要があります。Http404ただし、単に an または何かを上げることはできます。

于 2012-08-02T14:49:04.953 に答える
14

PDF ファイルは として開く必要がありrbますr

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
于 2015-04-18T14:00:10.667 に答える
7

インラインで取り出します。ファイルをサーバーから読み取る場合。また、HttpResponsekwargmimetypeは次のように置き換えられました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
于 2014-11-04T10:06:35.763 に答える
4

クラスベースのビューを使用して 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 を生成するには、Django プロジェクトの Docs on PDF Generationを参照してください。

Chris Pratt の応答は、既存の PDF を開く良い例を示しています。

于 2015-01-22T15:00:42.327 に答える
0

ブラウザはPDFリーダーではありません(適切なプラグイン/アドオンがない限り)。

代わりに、PDFをHTMLとしてレンダリングすることもできます。これは、バックエンドまたはフロントエンドから実行できます。

于 2012-08-02T14:52:30.953 に答える
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)
于 2016-10-21T15:51:01.363 に答える
0

これを行う最も簡単な方法は、おそらくテンプレート内のアンカーを使用することです。たとえば、Django のテンプレート エンジンを使用している場合 (おそらくこれを検索するほとんどの人がそうであるように)、アンカーを介して単純に静的ファイルとして提供します。

ファイルへのリンクを含むテンプレートで、一番上に追加します

{% load static %}

次に、PDFにリンクしたい場所に、

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

最初の行は、Django に静的ファイル用に構成されたディレクトリを調べるように指示しますsettings.py。アンカー タグで使用するパスは、 で静的ディレクトリとして設定した任意のディレクトリに対する相対パスですsettings.py。レンダリングされたリンクをクリックすると、静的ファイルが正しくパスされていれば、ブラウザーに PDF が表示されます。

于 2018-03-26T19:38:33.593 に答える
0

Use iframe url=url of pdf tag and give url of that pdf and make sure that your user will have full control of the project then pdf will be displayed on web screen

于 2021-10-22T17:31:29.807 に答える