在pisa html到pdf库中使用图像URL作为link_callback
相关内容:django - pisa : 在PDF输出中添加图片
我有一个网站,使用Google图表API来向用户展示各种报告,现在我想实现一个PDF版本。我在使用pisa.pisaDocument
时,设置了link_callback
参数,这对本地的媒体文件(比如css和图片)效果很好,但我在想,这个方法能否用在远程图片上(比如使用Google图表的URL)。
根据
,他们暗示这是可能的,但没有具体说明怎么做:通常情况下,pisa希望这些文件能在本地硬盘上找到。它们也可以相对于原始文档进行引用。不过,程序员可能想要从不同的来源加载,比如通过HTTP请求从互联网获取,或者从数据库等其他地方。
这是一个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效果很好,只是Google图表的图片没有显示出来。
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 要求没那么严格,所以要确保这个 uri 在 pisa 中是正确格式的。我之前的 uri 里有空格字符,这就是为什么一开始出错的原因(用 '+' 替换空格就解决了这个问题)。