2015-01-07 44 views
1

我有我的观点成立类似以下内容:图像输出失败

views.py

class PDFTemplateView(TemplateView): 
    Model = TemplateInfo 
    template_name = 'hello.html' 


    def get(self, *args, **kwargs): 
     obj = self.Model.objects.get(id = kwargs['pk']) 

     html = get_template(self.template_name).render(Context({'object' : obj})) 

     result = StringIO.StringIO() 
     rendering = pisa.pisaDocument(StringIO.StringIO(html.encode("ISO-8859-1")), result) 

     if not rendering.err: 
      return HttpResponse(result.getvalue(), mimetype='application/pdf') 
     return HttpResponse('We had some errors<pre>%s</pre>' % escape(html)) 

我发现了一个解决方案与fetch_resource()功能的认定中非常养活但didnt帮助我。我阅读文档,没有这个功能,我的生活变得更好。

这是我的模板 “hello.html的”

<style type="text/css"> 

@page { 
    background-image: url('/media/image/mainbg.jpg'); #this wouldnot give image too 
    size: letter portrait; 

    @frame header_frame {   /* Static Frame */ 
     -pdf-frame-content: header_content; 
     left: 50pt; width: 512pt; top: 50pt; height: 40pt; 
     -pdf-frame-border: 1; /* for debugging the layout */ 
    } 
    @frame content_frame {   /* Content Frame */ 
     left: 50pt; width: 512pt; top: 90pt; height: 632pt; 
     -pdf-frame-border: 1; /* for debugging the layout */ 
    } 
    @frame footer_frame {   /* Another static Frame */ 
     -pdf-frame-content: footer_content; 
     left: 50pt; width: 512pt; top: 772pt; height: 20pt; 
     -pdf-frame-border: 1; /* for debugging the layout */ 
    } 

</style> 
</head> 
<div id="header_content">Lyrics-R-Us</div> 

<div id="footer_content">(c) - page <pdf:pagenumber> 
    of <pdf:pagecount> 
</div> 

<ul> 
    <li>{{ object.emp_name }}</li> 
    <li>{{ object.designation }}</li> 
    <li>{{ object.image.url }}</li> 
</ul> 

一切似乎罚款至今。但我无法在pdf中获得图像。这{{ object.image.url}}给了我一个pdf格式的路径字符串,但不是图像。我错过了什么。请帮帮我。我已经坚持了几个小时。

+1

我想通了,我自己。我当时非常匆忙,我以为我只是复制和粘贴代码sinppet。对不起,麻烦你了。 – Dan

回答

0

Xhtmltopdf不使用“真正的”CSS规则。您的背景图片必须为pdf格式。尝试将'/media/image/mainbg.jpg'转换为pdf并使用background-image: url('/media/image/mainbg.pdf')

+0

嘿,谢谢你的回答。但那没有做任何事情。我仍然坚持! – Dan

+0

我记得我也在努力解决这个问题...尝试'background-image:url(/media/image/mainbg.pdf)'不带引号。 – Raphael

+0

我已经做过,没有引号。你还记得你怎么得到这个? – Dan

1

问题是xhtml2pdf找不到这些图像,除非您定义了一个link_callback函数来定义静态和媒体文件的路径。

此功能在xhtml2pdf文档:

def link_callback(uri, rel): 
    # use short variable names 
    sUrl = settings.STATIC_URL  # Typically /static/ 
    sRoot = settings.STATIC_ROOT # Typically /home/userX/project_static/ 
    mUrl = settings.MEDIA_URL  # Typically /static/media/ 
    mRoot = settings.MEDIA_ROOT  # Typically /home/userX/project_static/media/ 

    # convert URIs to absolute system paths 
    if uri.startswith(mUrl): 
     path = os.path.join(mRoot, uri.replace(mUrl, "")) 
    elif uri.startswith(sUrl): 
     path = os.path.join(sRoot, uri.replace(sUrl, "")) 

    # make sure that file exists 
    if not os.path.isfile(path): 
     raise Exception('media URI must start with %s or %s' % (sUrl, mUrl)) 
    return path 

确保定义所有的link_callback功能(STATIC_URL ...等)的路径。然后当你渲染文档时,像这样包含link_callback:

rendering = pisa.pisaDocument(StringIO.StringIO(html.encode("ISO-8859-1")), result, link_callback=link_callback) 
+0

即时通讯错误'全局名称link_callback未定义'在这一行'rendering = pisa.pisaDocument(StringIO.StringIO(html.encode(“ISO-8859-1”)),result,link_callback = link_callback)'。我已经完全像你说的那样定义了函数link_callback。 – Dan

+0

PDFTemplateView类中的link_callback是否可以访问该函数? – DreaminVM

+0

是的,这是在课堂上。我跟着文件,但我收到了这个错误。我找到了一个适用于我的解决方案,即从类中除去'link_callback()'函数并定义硬编码的媒体网址。但我仍然想知道是什么导致了这个错误。我遵循了文档中的所有说明。 – Dan

0

我一直在挣扎了很久类似的问题,直到我删除:

<pdf:pagecount> 

试试看