2012-08-02 74 views
0

我正在使用wkhtmltopdf.exe將HTML轉換爲PDF,使用下面的源代碼。問題是 - PDF顯示「?」代替中文,日文,俄文,阿拉伯文等所有非英文字符。以HTML格式輸出時,字符顯示正確。我試着對HTML(utf-8,utf-16,gb2312)設置不同的編碼,但PDF不能渲染非英文語言。wkhtmltopdf - 在導出的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); 
    } 
+0

您是否設法解決此問題?任何進度報告?我最近已經將我的應用程序從磁盤訪問轉換爲直接流,並且它仍然正常工作。那麼,這仍然是一個問題? – Nenotlep 2013-10-21 07:00:16

回答

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似乎沒有問題。

+0

我將html寫入臨時文件,而不是將它提供給stdin。實際上並沒有試圖直接餵它。我的方式會導致一些IO開銷,我知道:/ – Nenotlep 2012-08-08 10:49:43

1

Wkhtmltopdf絕對可以呈現非英文字符,如中文,日文,俄文,阿拉伯文。在大多數情況下,它們不會顯示,因爲HTML模板會丟失具有適當字符集定義的元標記。默認情況下,.NET使用UTF-8編碼,在這種情況下,HTML模板應包含以下meta標籤:

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

順便說一句,而不是調用wkhtmltopdf直接你可以使用像NReco的pdfGenerator的.NET包裝的一個(我是這個圖書館的作者)。

+0

這一個也不適合我。它只是顯示黑色填充框而不是字符。我想印地文印在pdf上 – 2017-07-25 13:19:11

相關問題