0

を使用しpdftkて、いくつかの動的な一時 PDF ファイルを生成し、Django がユーザーに提供します。

デスクトップでは正常に動作します-pdfファイルが開き、ユーザーは保存できますが、すべてのブラウザーのAndroid携帯で(iOSでも同じかもしれませんが、iOSデバイスがないためテストできません)、pdfは機能します正常にダウンロードされません。ダウンロードを開始しますが、その後常に失敗し、その理由がわかりません。

以下は、pdf バイナリ データを生成するビューと関数のスニペットです。

def get_pdf():
    fdf = {...}
    t1 = tempfile.NamedTemporaryFile(delete=False)
    t2 = tempfile.NamedTemporaryFile(delete=False)
    t1.file.write(fdf)

    # close temp files for pdftk to work properly
    t1.close()
    t2.close()

    p = Popen('pdftk %s fill_form %s output %s flatten' %
              ('original.pdf', t1.name, t2.name), shell=True)
    p.wait()

    with open(t2.name, 'rb') as fid:
        data = fid.read()

    # delete t1 and t2 since they are temp files

    # at this point the data is the binary of the pdf
    return data


def get_pdf(request):
    pdf = get_pdf()

    response = HttpResponse(pdf, mimetype='application/pdf')
    response['Content-Disposition'] = 'filename=foofile.pdf'
    return response

なぜこれが起こっているのかについてのアイデアはありますか?

4

1 に答える 1

1

@Pascal のコメントに従って、追加Content-Lengthしたところ、ダウンロードがモバイル デバイスで機能するようになりました。

ただし、ビューで割り当てたファイル名でダウンロードされていませんでした。を追加するとこれは修正されますが、デスクトップ ブラウザーに存在することattachmentは望ましくありません。attachmentしたがって、以下は機能する私の最終的な解決策です。

# I am using the decorator from http://code.google.com/p/minidetector/
@detect_mobile
def event_pdf(request, event_id, variant_id):
    pdf = get_pdf()

    response = HttpResponse(pdf, mimetype='application/pdf')
    response['Content-Disposition'] = '%sfilename=foofile.pdf' %
        request.mobile and 'attachment; ' or ''
    response['Content-Length'] = len(pdf)
    return response
于 2012-08-07T22:47:08.110 に答える