Dan*_*een 3 python pdf-generation pisa
我有一个网站使用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完全出来,除了谷歌图表不存在.
那么这比我预想的要容易得多.在您的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 /'+'固定它).