1

次のようにビューを設定しています。

ビュー.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()が、それは役に立ちませんでした。私はドキュメンテーションを読みましたが、関数がなくてもよかったです。

これは私のテンプレート「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にファイルパス文字列が表示されますが、画像には表示されません。私は何かが欠けていますか。お願い助けて。私はすでに何時間も立ち往生しています。

4

5 に答える 5

3

問題は、静的ファイルとメディア ファイルへのパスを定義する link_callback 関数を定義しない限り、xhtml2pdf がこれらの画像を見つけられないことです。

この関数は 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)
于 2015-01-07T20:58:40.027 に答える
1

同じ問題が発生しました。静的ファイルを保存した場所を指す必要があるため、設定で STATIC_ROOT を確認してください。

django-easy-pdf は、アセット (画像、CSS など) を STATIC_ROOT に指定するまで見つけることができませんでした。

https://github.com/nigma/django-easy-pdf/blob/master/docs/usage.rst

于 2015-07-17T06:02:26.120 に答える
0

Xhtmltopdf は「実際の」CSS ルールを使用しません。背景画像は pdf 形式である必要があります。「/media/image/mainbg.jpg」を pdf に変換して使用してみてくださいbackground-image: url('/media/image/mainbg.pdf')

于 2015-01-07T09:20:21.263 に答える
0

私は削除するまで、同様の問題に長い間苦労してきました:

<pdf:pagecount>

試してみる

于 2015-08-28T10:30:12.057 に答える