从Django表单打印PDF

0 投票
1 回答
3414 浏览
提问于 2025-04-17 04:06

我正在开发一个PDF生成器,用于我的可填写PDF表单。

现在我想在点击“打印表单”按钮时显示PDF,但目前没有任何错误提示,只是打开了一个空白的标签页(在火狐浏览器中)。

这是我在lib/tools.py中的print_rdba代码:

def print_rdba(client=None, data=None ,investment_form=None):
from django.http import HttpResponse
from clients.models import Transit
from products.models import ProductCategory
import cStringIO as StringIO
from dateutil.parser import parse
from datetime import date
from settings import URL
import re
from dateutil.relativedelta import relativedelta
from rates.models import InterestOption
from products.models import Product

URL = "/media/files/investment_forms/whatever.pdf"
file = ''
if investment_form:
    file = "%s" % URL

fdf = '<?xml version="1.0" encoding="UTF-8"?>\n<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">\n\t<fields>'


fdf += '''</fields>
    <f href="%s" target="_blank"/>
    </xfdf>''' % file

fdf = fdf.replace('^M', '')

response = HttpResponse(fdf.encode("ISO-8859-1"), mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=RDBA.xfdf'
return response

在我的视图中,我检查按钮是否被按下:

if request.POST.has_key('submit_rdba_form'):
            return print_rdba(client=primary_member, data = form.data)

我是不是漏掉了什么?我打算使用.xfdf文件来填充表单,但正如我之前所说的,我现在遇到的问题是PDF根本不显示。

谢谢

1 个回答

3

你的函数返回的响应不会直接显示一个PDF文件,而是会被当作一个文件附件处理,也就是说会被保存到磁盘上。这是因为有这么一行代码:

response['Content-Disposition'] = 'attachment; filename=RDBA.xfdf'

这行代码告诉浏览器要保存一个名为 RDBA.xfdf 的文件。

你需要检查一下是否有调用到 print_rdba 这个函数。如果你的按钮名字不是 submit_rdba_form,那么 request.POST.has_key('submit_rdba_form') 的结果会是 False

你也可以尝试把标记放到一个模板文件里,然后把这个模板渲染到响应中。这符合Django的MTV理念(模型-模板-视图,类似于 MVC,它把应用逻辑和展示分开),这样做更好,特别是你打算在文档中添加表单的时候:

xfdf.html 在你的 templates 文件夹里:

<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
    <fields>
    </fields>
    <f href="{{file}}" target="_blank"/>
</xfdf>

新的 print_rdba

from django.http import HttpResponse
from django.template.loader import get_template
from django.template import Context

def print_rdba(client=None, data=None ,investment_form=None):
    file = "/media/files/investment_forms/whatever.pdf"

    response = HttpResponse(mimetype='application/pdf')
    response['Content-Disposition'] = 'attachment; filename=RDBA.xfdf'
    template = get_template("xfdf.html")
    xfdf = template.render(Context({"file":file}))
    response.write(xfdf)
    return response

撰写回答