19

このスニペットを使用してテンプレートからPDFを生成しようとしています:

def write_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)
    if not pdf.err:
        return http.HttpResponse(result.getvalue(), mimetype='application/pdf')
    except Exception('PDF error')

ラテン語以外のすべての記号が正しく表示されていません。テンプレートとビューはutf-8エンコーディングを使用して保存されます。

ビューをANSIとして保存してから、ユーザーunicode(html、 "UTF-8")に保存しようとしましたが、TypeErrorがスローされます。

また、デフォルトのフォントがどういうわけかutf-8をサポートしていないためかもしれないと思ったので、pisaのドキュメントによると、スタイルセクションのテンプレート本体にfontfaceを設定しようとしました。

それでも結果は出ませんでした。

この問題を解決する方法を知っている人はいますか?

4

6 に答える 6

30

これは私にとってはうまくいきます:

pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result, encoding='UTF-8')
于 2009-11-24T10:57:55.690 に答える
3

交換してみてください

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

pdf = pisa.pisaDocument(StringIO.StringIO(html), result, encoding='UTF-8')

または、Djangoサイトのhtmlからpdfへのこの回答をチェックアウトしますか?

于 2009-10-28T13:37:25.170 に答える
2

djangoテンプレートを変更する必要があります。ドキュメントで使用されている文字を含むフォントファイルにリンクする新しいフォント面をスタイルシートに追加します。そして、そのフォントファイルはサーバーからアクセス可能でなければなりません(Ubuntuでは/ usr / share / fonts / truetype /ディレクトリにフォントのファイルがあります)。例えば:

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

次に、次のHTMLコードがある場合:

<div>Some non-latin characters</div>

このCSSルールを使用して、そのテキストをDejaMonoフォントで表示できます。

div { font-family: DejaMono; }

これは、キリル文字を使用してPDFドキュメントを生成するときに機能します。

于 2010-01-27T13:11:06.740 に答える
1

キリル文字でも同じ問題に直面しました。

ソリューションには2つのステップが含まれていました。1。HTMLファイル内のフォントファイルを指摘します。

<style type="text/css">
@font-face {
  font-family: Arial; src: url("files/arial.ttf");
}
body {
  font-family: Arial;
}
</style>

2.「pisa」ルートパスを指定します(相対パスでフォントファイルが見つかるようにします)。私の場合は、次のようになります。

pdf = pisa.pisaDocument(html, result, path=PATH_TO_DJANGO_PROJECT)

フォントがPATH_TO_DJANGO_PROJECT/files/arial.ttfに配置されたため

于 2017-10-18T23:25:05.457 に答える
0

pisaDocumentメソッドの代わりにcreatePDFを呼び出す場合は、次を使用できます。

pisa.CreatePDF(html.encode('UTF-8'), response, link_callback=fetch_resources, encoding='UTF-8')
于 2010-07-27T10:11:51.640 に答える
0

xhtml2pdfバージョン0.2.4を使用しています。同じ問題に直面し、次のエンコーディングを使用して解決できました。

def render_to_pdf(template_src, context_dict={}):
    template = get_template(template_src)
    html = template.render(context_dict)
    result = BytesIO()

    # PDF
    pdf = pisa.pisaDocument(BytesIO(html.encode("utf-8")), result)
    if not pdf.err:
        return HttpResponse(result.getvalue(), content_type='application/pdf')
    return None

それから私の見解では、私は次のように定義しました:

def download_pdf(request, pk):
item = get_object_or_404(object, id=pk)
if item:
    context ={
        'item': item
    }
    template_name = 'template.html'
    pdf = render_to_pdf(template_name, context)
    return HttpResponse(pdf, content_type='application/pdf')

else:
    messages.info(request, 'Item not found')
    return redirect('home')

私のHTML:

{% load static %}
{% load humanize %}
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <link rel="icon" type="image/gif" href="{% static 'images/profile.png' %}" />
    <title>{{ item.scientific_name}}</title>
    <link rel="stylesheet" href="{% static 'style/Bootstrap/css/bootstrap.min.css' %}">

   <style>
    @page {
        size: letter;
        margin: 2cm;

        @frame footer_frame {
            /* Another static Frame */
            -pdf-frame-content: footer_content;
            left: 50pt;
            width: 512pt;
            top: 760pt;
            height: 50px;
        }

        table {
            -pdf-keep-with-next: true;
        }
    }

    ul {
        list-style-type: none;
    }

    ul li span {
        font-weight: bold;
    }
</style>
于 2020-05-05T12:02:55.453 に答える