在pisa html到pdf库中使用link_callback的图像URL

时间:2010-10-22 21:02:51

标签: python pdf-generation pisa

相关:django - pisa : adding images to PDF output

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

来自比萨网站上的documentation,他们暗示这是可能的,但他们没有说明如何:

  

Normaly 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完全出来,除了谷歌图表图像不存在。

1 个答案:

答案 0 :(得分: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, ""))

对于图片网址,浏览器不那么挑剔,因此请确保为比萨正确引用uri。我有空间角色,这就是为什么它最初失败的原因(替换w /'+'固定它)。