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

Dan*_*een 3 python pdf-generation pisa

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

我有一个网站使用Google Chart API向用户显示一堆报告,我正在尝试实现PDF版本.我使用的link_callback参数pisa.pisaDocument伟大的工程的当地媒体(CSS /图片),但我不知道它是否会与远程图像(使用谷歌图表URL)工作.

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

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')
Run Code Online (Sandbox Code Playgroud)

我尝试让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, ""))
Run Code Online (Sandbox Code Playgroud)

它生成的PDF完全出来,除了谷歌图表不存在.

Dan*_*een 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, ""))
Run Code Online (Sandbox Code Playgroud)

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