2012-04-19 354 views
3

我正在嘗試使用包含非拉丁字符的ITextRenderer生成pdf文檔。在我這裏是保加利亞語。使用ITextRenderer從HTML生成pdf文件時的編碼問題

在致電ITextRenderer,我有一個字符串內容一些進程(如與整潔解析)看起來像後(我能看透調試這個值)

斯汀內容

td class="description">Вид на потока</td> 
td class="description">Статус на потока</td> 

以上只是我的字符串的一部分。此內容包含有效的html語法。我只是在這裏放一小部分來澄清,直到這部分,我的編碼是正確的,因爲我能夠讀取保加利亞字符。

之後,下面的代碼發生這將創建一個文件,把它放在itextrenderer並生成PDF文件。此代碼已經測試和工作latin字符的內容,因爲我能夠成功地生成英文pdf文件。

問題出現當我切換到另一種語言(保加利亞語)與非拉丁字符。生成的PDF將忽略所有保加利亞字符,最終結果是帶有大量空行的pdf。這是生成的PDF

 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 

     dbf.setValidating(false); 
     dbf.setNamespaceAware(false); 
     dbf.setFeature("http://xml.org/sax/features/namespaces", false); 
     dbf.setFeature("http://xml.org/sax/features/validation", false); 
     dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); 
     dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 

     DocumentBuilder builder = dbf.newDocumentBuilder(); 

     Document doc = builder.parse(new ByteArrayInputStream(content.getBytes("UTF-8"))); 

     ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
     InputStream is = null; 

     ITextRenderer renderer = new ITextRenderer(); 

     renderer.getFontResolver().addFont("fonts/TIMES.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
     renderer.getFontResolver().addFont("fonts/TIMESBD.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
     renderer.getFontResolver().addFont("fonts/TIMESBI.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
     renderer.getFontResolver().addFont("fonts/TIMESI.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 


     renderer.setDocument(doc, null); 
     renderer.layout(); 
     renderer.createPDF(outputStream); 
     outputStream.close(); 


     byte[] outputBytes = outputStream.toByteArray(); 
     is = new ByteArrayInputStream(outputBytes); 
     response.setContentType("application"); 
     response.addHeader("Content-Disposition", "attachment; filename=\"" + "exported.pdf" + "\""); 
     response.setContentLength(outputBytes.length); 
     response.getOutputStream().write(inputStreamToBytes(is)); 

我已經試過幾件事情(主要涉及到編碼),但不幸的是我還沒有找到一個解決辦法代碼的一部分。也許我缺少明顯的東西在這裏:)

我不知道這是否增加任何價值,但是我用的彈簧和該代碼控制器

任何幫助將不勝感激內運行。

Thanx

回答

1

您的HTML是否指定了UTF-8編碼?您的字體文件是否在該路徑中找到?

看看this gist,它說它適用於Linux上的中文字符,它提供了一個指向系統中字體默認位置的路徑。

+0

Thanx的答覆。你認爲這是一個字體問題?我需要特定的字體來顯示非拉丁字符嗎?我很確定我的字體是在正確的位置,但我會試一試,我會讓你知道 – alexandros

+0

你好。我再次檢查它。字體正確加載。我也運行你建議的FontTest。我面臨同樣的問題。我加載支持西里爾字符的字體。然而PDF忽略它們並打印空行。有什麼建議麼? – alexandros

+1

我剛剛添加了一個新的職位,解釋我的問題更詳細http://stackoverflow.com/questions/10250606/generation-of-pdf-from-html-with-non-latin-characters-using-itext-does-not -工作 – alexandros