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" />

顺便说一句,您可以使用 NReco PdfGenerator 之类的 .NET 包装器之一(我是这个库的作者),而不是直接调用 wkhtmltopdf。

于 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 回答