1

以下のソースコードを使用して、wkhtmltopdf.exeを使用してHTMLをPDFに変換しています。問題は、PDFに「?」と表示されていることです。中国語、日本語、ロシア語、アラビア語などのすべての英語以外の文字の代わりに。HTMLとして出力する場合、文字は正しく表示されます。HTML(utf-8、utf-16、gb2312)に別のエンコーディングを設定しようとしましたが、PDFは英語以外の言語をレンダリングしません。

サーバーへの中国語フォントのインストールについてwkhtmltopdfフォーラムで読みましたが、Windowsサーバー環境用ではないようです。さらに、HTMLは正しくレンダリングされるので、フォントはサーバーで使用できるようです。

それを機能させるためのアイデアはありますか?

コード:

private void WritePDF(string html)
    {
        string inFileName,
                outFileName,
                tempPath;
        Process p;
        System.IO.StreamWriter stdin;
        ProcessStartInfo psi = new ProcessStartInfo();


        tempPath = Request.PhysicalApplicationPath 
            + ConfigurationManager.AppSettings[Constants.AppSettings.ExportToPdfTempFolder];
        inFileName = Session.SessionID + ".htm";
        outFileName = Session.SessionID + ".pdf";

        // run the conversion utility
        psi.UseShellExecute = false;
        psi.FileName = Server.MapPath(ConfigurationManager.AppSettings[Constants.AppSettings.ExportToPdfExecutablePath]);
        psi.CreateNoWindow = true;
        psi.RedirectStandardInput = true;
        psi.RedirectStandardOutput = true;
        psi.RedirectStandardError = true;
        //psi.StandardOutputEncoding = System.Text.Encoding.gb;

        // note that we tell wkhtmltopdf to be quiet and not run scripts
        // NOTE: I couldn't figure out a way to get both stdin and stdout redirected so we have to write to a file and then clean up afterwards
        psi.Arguments = "-q -n - " + tempPath + outFileName;

        p = Process.Start(psi);

        try
        {
            stdin = p.StandardInput;
            stdin.AutoFlush = true;

            stdin.Write(html);
            stdin.Close();

            if (p.WaitForExit(15000))
            {
                // NOTE: the application hangs when we use WriteFile (due to the Delete below?); this works
                Response.BinaryWrite(System.IO.File.ReadAllBytes(tempPath + outFileName));
            }
        }
        finally
        {
            p.Close();
            p.Dispose();
        }

        // delete the pdf
        System.IO.File.Delete(tempPath + outFileName);
    }
4

2 に答える 2

5

Wkhtmltopdf は間違いなく、中国語、日本語、ロシア語、アラビア語などの英語以外の文字をレンダリングできます。ほとんどの場合、HTML テンプレートには適切な文字セット定義のメタ タグがないため、これらは表示されません。デフォルトでは、.NET は UTF-8 エンコーディングを使用します。この場合、HTML テンプレートには次のメタ タグを含める必要があります。

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

ところで、wkhtmltopdf を直接呼び出す代わりに、NReco PdfGenerator のような .NET ラッパーの 1 つを使用できます (私はこのライブラリの作成者です)。

于 2015-12-21T11:07:50.840 に答える
0

フォントが文字をサポートしていること、ソースが UTF-8 であることを確認してください。動作するはずです。韓国語、中国語、ポーランド語、およびその他のさまざまな文字を使用して wkhtmltopdf をテストしましたが、常に動作していました。他の同様の質問に関する私の回答を参照してください https://stackoverflow.com/a/11862584/694325

私はHTMLソースを次のように書いていますが、それ以外の点では、私のPDF生成はあなたのものと非常に似ています. どこでもすべてがutf-8であることを確認します。

using (TextWriter tw = new StreamWriter(path, false, System.Text.Encoding.UTF8))
{
    tw.WriteLine(contents);
}

このようなソースから生成された PDF は問題なく動作するようです。

于 2012-08-08T10:43:14.350 に答える