相关: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完全出来,除了谷歌图表图像不存在。
答案 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 /'+'固定它)。