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 回答