django - pisa:将图像添加到 PDF 输出
Posted
技术标签:
【中文标题】django - pisa:将图像添加到 PDF 输出【英文标题】:django - pisa : adding images to PDF output 【发布时间】:2011-01-11 21:43:14 【问题描述】:我正在使用来自网络 (http://www.20seven.org/journal/2008/11/pdf-generation-with-pisa-in-django.html) 的标准示例将 django 视图/模板转换为 PDF。
是否有一种“简单”的方法可以在模板中包含图像(来自 url 或服务器上的引用)以便它们显示在 PDF 中?
【问题讨论】:
链接失效 - 就是这样:20seven.org/journal/2008/11/11/… 【参考方案1】:我得到了图像。代码如下:
from django.http import HttpResponse
from django.template.loader import render_to_string
from django.template import RequestContext
from django.conf import settings
import ho.pisa as pisa
import cStringIO as StringIO
import cgi
import os
def dm_monthly(request, year, month):
html = render_to_string('reports/dmmonthly.html', 'pagesize' : 'A4', , context_instance=RequestContext(request))
result = StringIO.StringIO()
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), dest=result, link_callback=fetch_resources )
if not pdf.err:
return HttpResponse(result.getvalue(), mimetype='application/pdf')
return HttpResponse('Gremlins ate your pdf! %s' % cgi.escape(html))
def fetch_resources(uri, rel):
path = os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, ""))
return path
这是从http://groups.google.com/group/xhtml2pdf/browse_thread/thread/4cf4e5e0f4c99f55大量获取的
【讨论】:
仅供非 Django 用户参考,MEDIA_ROOT
是您要转换的 html 文档的物理位置,MEDIA_URL
是 http-friendly 版本该位置(例如,对于本地 html 文件:MEDIA_URL = 'file:///' + MEDIA_ROOT
)。否则,这是一个合理的通用解决方案!
如果我使用 S3 会怎样?【参考方案2】:
HTML 和 Django version=2.0 中的以下代码行对我有用。
<img src="company.logo.path" >
【讨论】:
我在做<img src=" company.logo.url " height="100px">
确保将其更改为 .path
。【参考方案3】:
尽管尝试了我在谷歌上找到的所有解决方案,但我无法显示图像。但是这个软糖对我有用,因为 pisa 的命令行版本可以显示图像:
from tempfile import mkstemp
# write html to a temporary file
# can used NamedTemporaryFile if using python 2.6+
fid, fname = mkstemp(dir='/tmp')
f = open(fname, 'w+b')
f.write(html)
f.close()
# now create pdf from the html
cmd = 'xhtml2pdf "%s"' % fname
os.system(cmd)
os.unlink(fname)
# get the content of the pdf
filename = fname+'.pdf'
pdf = open(filename, 'r')
content = pdf.read()
pdf.close()
os.unlink(pdf.name)
# return content
response = HttpResponse(content, mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=draft.pdf'
这适用于图像具有 url 或完整路径名的情况,例如。
<img src="/home/django/project/site_media/css/output/images/logo.jpg" />
<img src="http://www.mysite.com/css/output/images/logo.jpg" />
【讨论】:
【参考方案4】:def render_to_pdf( template_src, context_dict):
template = get_template(template_src)
context = Context(context_dict)
html = template.render(context)
result = StringIO.StringIO()
if page has an image.something:
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), dest=result, link_callback=fetch_resources)
else no image.something :
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")),result)
if not pdf.err:
return HttpResponse(result.getvalue(), mimetype='examination_report/pdf')
return HttpResponse('We had some errors<pre>%s</pre>' % escape(html))
def fetch_resources(uri, rel):
if os.sep == '\\': # deal with windows and wrong slashes
uri2 = os.sep.join(uri.split('/'))
else:# else, just add the untouched path.
uri2 = uri
path = '%s%s' % (settings.SITE_ROOT, uri2)
return path
【讨论】:
【参考方案5】:以上所有代码都对我不起作用。最后,我通过放置 get_full_path 程序让它工作。所以最终的代码是这样的
def render_to_pdf( template_src, context_dict):
now = datetime.now()
filename = now.strftime('%Y-%m-%d') + '.pdf'
template = get_template(template_src)
context = Context(context_dict)
html = template.render(context)
result = StringIO.StringIO()
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")),result, path=path)
if not pdf.err:
response = HttpResponse(result.getvalue(), mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename="'+filename+'"'
return response
return HttpResponse('We had some errors<pre>%s</pre>' % escape(html))
def get_full_path_x(request):
full_path = ('http', ('', 's')[request.is_secure()], '://',
request.META['HTTP_HOST'], request.path)
return ''.join(full_path)
【讨论】:
【参考方案6】:您也可以将图像转换为 base64。
http://www.motobit.com/util/base64-decoder-encoder.asp
转换为 base64,您将永远不会遇到图像链接问题。
【讨论】:
是的,图片可以转base64。请添加一个示例,说明如何将它们放入 pdf 中。【参考方案7】:之后您可以随时使用 IText/ISharp 添加图像。
【讨论】:
以上是关于django - pisa:将图像添加到 PDF 输出的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中将 HTML 字符串转换为图像 [关闭]