3

相关:django - pisa:将图像添加到 PDF 输出

我有一个使用 Google Chart API 向用户显示一堆报告的网站,我正在尝试实现 PDF 版本。我正在使用适用于本地媒体(css/images)的link_callback参数pisa.pisaDocument,但我想知道它是否适用于远程图像(使用谷歌图表 URL)。

从比萨网站上的文档中,他们暗示这是可能的,但他们没有展示如何:

通常,pisa 期望这些文件可以在本地驱动器上找到。它们也可以相对于原始文档进行引用。但是程序员可能希望通过 HTTP 请求或从数据库或其他任何东西从不同类型的源(如 Internet)加载。

这是在 Django 项目中,但这无关紧要。这是我用于渲染的内容:

html = render_to_string('reporting/pdf.html', keys,
                        context_instance=RequestContext(request))
result = StringIO.StringIO()
pdf = pisa.pisaDocument(
        StringIO.StringIO(html.encode('ascii', 'xmlcharrefreplace')),
        result, link_callback=link_callback)
return HttpResponse(result.getvalue(), mimetype='application/pdf')

我尝试让 link_callback 返回一个 urllib 请求对象,但它似乎不起作用:

def link_callback(uri, rel):
    if uri.find('chxt') != -1:
        url = "%s?%s" % (settings.GOOGLE_CHART_URL, uri)
        return urllib2.urlopen(url)
    return os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, ""))

它生成的 PDF 非常完美,只是没有谷歌图表图像。

4

1 回答 1

6

好吧,这比我预期的要容易得多。在您的link_callback方法中,如果 uri 是远程图像,则只需返回该值。

def link_callback(uri, rel):
    if uri.find('chart.apis.google.com') != -1:
        return uri
    return os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, ""))

浏览器对图像 URL 的挑剔要少得多,因此请确保为 pisa 正确引用 uri。我的里面有空格字符,这就是它一开始失败的原因(用'+'替换它修复了它)。

于 2010-10-25T14:29:16.997 回答