3

私は pisa を使用して、django アプリケーションで html から pdf を生成しています。私のビューコードは次のとおりです

if request.method == 'POST':        
    return write_to_pdf(request.POST['convert'], { }, 'file')

convert は、pdf ファイルに書き込む値を取得する TextArea です。

write_to_pdf

def fetch_resources(uri, rel):
    path = '%s/media/pdf/' % RHOMBUS_PATH
    return path

def write_to_pdf(template_data, context_dict, filename):
    print template_data
    template = Template(template_data)
    context = Context(context_dict)
    html = template.render(context)
    print html
    result = StringIO.StringIO()
    pdf = pisa.CreatePDF(html.encode('UTF-8'), result, link_callback=fetch_resources, encoding='UTF-8')
    print result.getvalue()

    if not pdf.err:
        response = http.HttpResponse(mimetype='application/pdf')
        response['Content-Disposition'] = 'attachment; filename=%s.pdf' % filename
        response.write(result.getvalue())
        return response
    return http.HttpResponse('Problem creating PDF: %s' % cgi.escape(html))

ただし、生成された pdf には、TextArea に次のような強調されたギリシャ文字がある場合に問題があります。

ά έ 

エンコーディングを変更しようとしましたが、何もしませんでした。どんな助けでも大歓迎です。

4

1 に答える 1

3

ギリシャ文字にもこの問題がありました(強調された文字の代わりに、ブラックボックスを受け取りました)。最初のステップとして、フォントを適切なもの (dejavu sans など) に変更する必要があります。これを行うには、次のようにstyle要素を html テンプレートに追加します。

<style type='text/css'>

    @font-face {
        font-family: "DejaVuSansMono";
        src: url("fonts/DejaVuSansMono.ttf");
    }

    @font-face {
        font-family: "DejaVuSansMono";
        src: url("fonts/DejaVuSansMono-Bold.ttf");
        font-weight: bold;
    }
    @font-face {
        font-family: "DejaVuSansMono";
        src: url("fonts/DejaVuSansMono-Oblique.ttf");
        font-style: italic, oblique;
    }
    @font-face {
        font-family: "DejaVuSansMono";
        src: url("fonts/DejaVuSansMono-BoldOblique.ttf");
        font-weight: bold;
        font-style: italic, oblique;
    }

    *, html {
        font-family: "DejaVuSansMono";
    }

    html {
        padding:10pt;
    }

</style>

現在、dejavusans フォントはhttp://dejavu-fonts.org/wiki/Main_Pageからダウンロードできます。また、フォント ファイルを配置する場所にはさまざまな問題があります。 xhtml2pdf を使用して Unicode テンプレートを pdf に変換する際の問題に対する私の回答について、いくつかの洞察を提供しました。C:/fonts最初のステップとして、これらのフォントを(または/tmp/fontsunix を使用している場合は) に配置@font-faceし、たとえばの絶対 URL を使用することを提案します。

@font-face {
    font-family: "DejaVuSansMono";
    src: url("c:/fonts/DejaVuSansMono.ttf");
}

その後、私の回答を確認して、相対 URL の使用方法を確認してください。

最後に、私は上記を dejavu-sans でのみテストした (そして問題なく動作する) ことを言及する必要があります。フィードバックをお寄せください。

上記がうまくいかない場合は、render_to_pdf私が使用している関数を見てください:

def render_to_pdf(template_src, context_dict):
    template = get_template(template_src)
    context = Context(context_dict)
    html  = template.render(context)
    result = StringIO.StringIO()

    pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result, path= settings.PROJECT_PATH) 

    if not pdf.err:
        return HttpResponse(result.getvalue(), content_type='application/pdf')
    return HttpResponse('<pre>%s</pre>' % escape(html))
于 2013-12-23T10:31:30.533 に答える