3

関連:django --pisa:PDF出力に画像を追加する

Google Chart APIを使用してユーザーに一連のレポートを表示するサイトがあり、PDFバージョンを実装しようとしています。link_callbackローカルメディア(css / images)に最適なパラメーターを使用していますpisa.pisaDocumentが、リモート画像(google charts URLを使用)で機能するかどうか疑問に思っています。

ピサのウェブサイトのドキュメントから、これが可能であることが示唆されていますが、その方法は示されていません。

通常、pisaは、これらのファイルがローカルドライブにあることを想定しています。また、元のドキュメントを基準にして参照することもできます。しかし、プログラマーは、HTTP要求を介して、またはデータベースなどから、インターネットなどのさまざまな種類のソースからロードしたい場合があります。

これは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')

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

それが生成するPDFは、グーグルチャートの画像がそこにないことを除いて完全に出てきます。

4

1 に答える 1

6

さて、これは私が思っていたよりもずっと簡単でした。メソッドで、URIがリモートイメージの場合は、link_callbackその値を返すだけです。

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

ブラウザは画像のURLについてあまり気にしないので、uriがpisaに対して適切に引用されていることを確認してください。私は私の中にスペース文字を持っていたので、最初は失敗していました(w /'+'を置き換えると修正されました)。

于 2010-10-25T14:29:16.997 に答える