5

HTML ページで正しく表示されている Unicode を HTML ページで使用しています。しかし、xhtml2pdf を使用して html に変換しているときに、Unicode に黒く塗りつぶされた四角形のボックスが生成されます。UTF-8 設定以外の unicode の設定はありますか。ユニコードの問題だとは思わない。

# convert HTML to PDF
pisaStatus = pisa.CreatePDF(
        StringIO(sourceHtml.encode('utf-8')),                 
        dest=resultFile)

完全な py コード:

# -*- coding: utf-8 -*-

from xhtml2pdf import pisa
from StringIO import StringIO

source = """<html>
            <style>
                @font-face {
                font-family: Preeti;
                src: url("preeti.ttf");
                }

                body {
                font-family: Preeti;
                }
            </style>
            <body>
                This is a test <br/>
                       सरल
            </body>
        </html>"""

# Utility function
def convertHtmlToPdf(source):
    # open output file for writing (truncated binary)

    pdf = StringIO()
    pisaStatus = pisa.CreatePDF(StringIO(source.encode('utf-8')), pdf)

    # return True on success and False on errors
    print "Success: ", pisaStatus.err
    return pdf

# Main program
if __name__=="__main__":
    print pisa.showLogging()
    pdf = convertHtmlToPdf(source)
    fd = open("test.pdf", "w+b")
    fd.write(pdf.getvalue())
    fd.close()

生成された pdf ファイル

フォントフェイスを含める必要さえありますか??

4

4 に答える 4

2

fontface少し遅い答えですが、相対パスがxhtml2pdfで機能しない理由を知ることが重要だと思います:

CreatePDF関数 ( https://github.com/chrisglass/xhtml2pdf/blob/master/xhtml2pdf/pisa.py に見られるメソッドと同じ)pisaDocumentは、名前付きパラメーターがあります。ここで、このパラメーターを設定せずに相対パスを使用すると、ファイルhttps://github.com/chrisglass/xhtml2pdf/blob/master/で確認できる名前のフォルダーの下でフォントを見つけようとします。 xhtml2pdf/context.py ( dummyを検索)。path__dummy__

そのため、.ttfファイルは絶対パスを使用した場合にのみ機能します。

これを解決するには、次のいずれかを実行できます。

  • __dummy__フォルダーを作成して.ttfそこにファイルを配置する、または
  • pathの名前付きパラメータに値を渡すCreatePDF

たとえば、私の場合、django を使用して PDF を作成しているので、manage.pyと同じpath='.'フォルダーに渡して配置.ttfしました。すべて正常に動作しています。より良い解決策は、それを定義して使用することです。SETTINGS.PROJECT_PATH

于 2013-12-20T12:01:21.867 に答える
0

documentationから、エンコーディングを指定する必要があるように見えます。CreatePDFそうでない場合、「これは HTML5 パーサーによって推測されます」。

したがって、HTML ファイルのヘッダーが、デーバナーガリーに使用されていた従来の文字セットを指定しているとします。表示されたコードの前のどこかでそれを適切に Unicode にデコードしてから、UTF-8 として再エンコードしますが、ヘッダーは別の文字セットを指定しています。その場合、html5lib は間違った文字セットを推測し、文字を正しく解釈せず、文字化けします。

もちろん、完全な例がなければ、それがまさにあなたが直面している問題であるかどうかはわかりませんが、おそらくそのようなものです. そして、最も可能性の高い解決策は、それらのいずれについても同じです。UTF-8 にエンコードする場合は、推測する代わりに UTF-8 を使用するようにコンバーターに指示します。

pisaStatus = pisa.CreatePDF(
    StringIO(sourceHtml.encode('utf-8')),                 
    dest=resultFile,
    encoding='utf-8')
于 2013-08-23T18:05:42.123 に答える