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

3 投票
1 回答
4656 浏览
提问于 2025-04-16 05:56

相关内容:django - pisa : 在PDF输出中添加图片

我有一个网站,使用Google图表API来向用户展示各种报告,现在我想实现一个PDF版本。我在使用pisa.pisaDocument时,设置了link_callback参数,这对本地的媒体文件(比如css和图片)效果很好,但我在想,这个方法能否用在远程图片上(比如使用Google图表的URL)。

根据

pisa官网的文档

,他们暗示这是可能的,但没有具体说明怎么做:

通常情况下,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 里有空格字符,这就是为什么一开始出错的原因(用 '+' 替换空格就解决了这个问题)。

撰写回答