1

私はDjangoを使用しており、PDFをレンダリングするコードは本当に典型的です:

t = loader.get_template('back/templates/content/receipt.html')
c = RequestContext(request, {
                             'pagesize': 'A4',
                             'invoice': invoice,
                             'plan': plan,
                             })

html = t.render(c)
result = StringIO.StringIO()
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result)
if not pdf.err:
    return HttpResponse(result.getvalue(), mimetype="application/pdf")

そして、recipe.html は珍しいものではありません。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Squizzal Receipt</title>
    <style type="text/css">
        @page {
            size: {{pagesize}};
            margin: 1cm;
            word-spacing 1cm;
            @frame footer {
                -pdf-frame-content: footerContent;
                bottom: 0cm;
                margin-left: 9cm;
                margin-right: 9cm;
                height: 1cm;
            }
        }
    </style>
</head>
<body>
    <h1>Your Receipt</h1>
   <<SNIP>>

ただし、pdf のスペースはレンダリングされません。すべての言葉は隣り合っています。通常のスペースと「 」を試しましたが、結果は同じです。たとえば、上記は PDF では「YourReceipt」と表示されます。

pisa のコマンド ライン バージョンを使用しようとすると、単語間にスペースを入れても問題なく pdf が生成されます。

何かご意見は?

4

2 に答える 2

4

私はこれと同じ問題を抱えていたので、ブラウザから PDF を強制的にダウンロードしたくありませんでした。これはプラットフォーム固有の問題であることが判明しました。Google Chrome のネイティブ PDF ビューア プラグインは、Microsoft TrueType フォントがインストールされていない場合、特定の Linux ディストリビューションで特定のドキュメントのスペースをレンダリングできません。詳細については、 http://www.google.com/support/forum/p/Chrome/thread?tid=7169b114e8ea33c7&hl=enをご覧ください。

bashで次のコマンドを実行するだけでこれを修正しました(ディストリビューションに合わせて調整します。これはUbuntuでした):

$ sudo apt-get install msttcorefonts

(インストール プロセス中に EULA に同意します)

$ fc-cache -fv

Chrome を再起動した後 (重要!)、ネイティブの PDF ビューアーは PDF をスペース付きで正しく表示しました。

于 2012-02-02T05:33:05.023 に答える
0

akonsu のおかげで、問題は Django の HttpResponse の処理方法 (サーバー側またはブラウザー側のいずれか) にあるようです。

それ以外の

 return HttpResponse(result.getvalue(), mimetype="application/pdf")

使用する:

 resp = HttpResponse(result.getvalue(), mimetype="application/pdf")
 resp['Content-Disposition'] = 'attachment; filename=receipt.pdf'
 return resp

これにより、少なくともスペースなしで結果が生成されます。最初の方法が機能しなかった理由はまだわかりません。

于 2011-09-11T23:47:27.533 に答える