Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django pdf xhtml2pdf中的图像输出失败_Django_Xhtml2pdf - Fatal编程技术网

Django pdf xhtml2pdf中的图像输出失败

Django pdf xhtml2pdf中的图像输出失败,django,xhtml2pdf,Django,Xhtml2pdf,我的观点如下: 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_

我的观点如下:

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))

到目前为止,一切似乎都很好。但我无法获得pdf格式的图像。这个
{{object.image.url}
在pdf中给了我一个五路径字符串,但不是图像。我错过了什么吗。请帮帮我。我已经被困了好几个小时了。

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

问题是,除非定义一个链接回调函数来定义静态文件和媒体文件的路径,否则xhtml2pdf无法找到这些图像

此函数位于xhtml2pdf文档中:

rendering = pisa.pisaDocument(StringIO.StringIO(html.encode("ISO-8859-1")), result, link_callback=link_callback)
确保在link_回调函数中定义所有路径(静态_URL…等)。然后在呈现文档时,包括如下所示的link_回调:

<pdf:pagecount>

我遇到了同样的问题。请检查您的静态根目录设置,因为它应该指向您存储静态文件的位置

django easy pdf无法找到您的资产(图像、css等),除非您将它们指向静态根目录


我一直在为类似的问题挣扎很长时间,直到我删除了:

os.path.abspath('collected-static/')


试一下吧

迟来的回答,但上面没有一个能帮我解决这个问题

以下是为我解决问题的方法:

在settings.py中将STATIC_ROOT定义为:

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 "" if not defined in settings.py
    mRoot = settings.MEDIA_ROOT     # Typically /home/userX/project_static/media/

    # convert URIs to absolute system paths
    if uri.startswith(sUrl):
        # Replaces 'static/image.png' with 'c:\\my-project\\collected-static/image.png'
        path = os.path.join(sRoot, uri.replace(sUrl, ""))
    elif uri.startswith(mUrl):
        # MEDIA_URL default value is "" so everything matches this
        path = os.path.join(mRoot, uri.replace(mUrl, ""))

    # 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_回调函数时,必须定义MEDIA_URL,因为MEDIA_URL的默认值是“”,它匹配每个URI的开头

请先定义媒体URL或重新编写链接回调函数以检查静态链接:


嘿,谢谢你的回答。但这并没有起到任何作用。我还是被卡住了!我记得我也在为这个问题挣扎。。。请尝试不带引号的
背景图像:url(/media/image/mainbg.pdf)
。我已经用引号和不带引号做过了。你还记得你是如何处理这个问题的吗?我的模板(doc.html)代码是
@page{background image:url({{bgpdf}});size:…}
,我用render和参数
{bgpdf':'path/to/doc.pdf}
调用它。我将做两件事:首先尝试以html格式呈现视图,以确保文档的路径正确;其次尝试引用本地pdf文件,以确保格式正确。我还对代码中的link\u callback=fetch\u资源进行了注释。谢谢你的回答。让我试试看,我会给你回复的。我收到了这个错误,这行中没有定义全局名称链接回调,
rendering=pisa.pisaDocument(StringIO.StringIO(html.encode)(“ISO-8859-1”)),result,link\u callback=link\u callback)
。我已经像你说的那样定义了函数link_回调。link_回调是否在PDFTemplateView类中,以便get可以访问该函数?是的,它在类中。我遵循了文档,但我收到了这个错误。我找到了一个适合我的解决方案,那就是从类中删除
link\u callback()
函数,并定义硬编码的媒体URL。但是我仍然想知道是什么导致了这个错误。我遵循了文档中的所有说明。link_回调函数告诉xhtml2pdf在哪里可以找到静态和媒体文件(只要settings.py中的URL是正确的)。请注意,模块文档有错误,但我尝试了我发布的解决方案,并使其正常工作。我自己发现了这一点。我当时很忙,我想我应该复制并粘贴代码sinppet。对不起,打扰你了。
os.path.abspath('collected-static/')
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 "" if not defined in settings.py
    mRoot = settings.MEDIA_ROOT     # Typically /home/userX/project_static/media/

    # convert URIs to absolute system paths
    if uri.startswith(sUrl):
        # Replaces 'static/image.png' with 'c:\\my-project\\collected-static/image.png'
        path = os.path.join(sRoot, uri.replace(sUrl, ""))
    elif uri.startswith(mUrl):
        # MEDIA_URL default value is "" so everything matches this
        path = os.path.join(mRoot, uri.replace(mUrl, ""))

    # 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