2014-02-28 71 views
2

當我嘗試使用iText將越南文文檔導出爲PDF時,我遇到了問題。 我把越南話的.xml文件這樣如何使用iText將越南文文本導出爲PDF

<td fontfamily="Helvetica" fontstyle="0" fontsize="9" align="0" colspan="48" lineoccupied="1">T\u1ED5 ch\u1EE9c tham gia</td> 

然後讓Java從XML文件中獲得的短語和使用這種方法將其轉換成Unicode:

public String convertToUnicode(String s) { 
     int i = 0, len = s.length(); 
     char c; 
     StringBuffer sb = new StringBuffer(len); 
     try { 
      while (i < len) { 
       c = s.charAt(i++); 
       if (c == '\\') { 
        if (i < len) { 
         c = s.charAt(i++); 
         if (c == 'u') { 
          if (Character.digit(s.charAt(i), 16) != -1 
            && Character.digit(s.charAt(i + 1), 16) != -1 
            && Character.digit(s.charAt(i + 2), 16) != -1 
            && Character.digit(s.charAt(i + 3), 16) != -1) { 
           if (s.substring(i).length() >= 4) { 
            c = (char) Integer.parseInt(s.substring(i, i + 4), 16); 
            i += 4; 
           } else { 
            sb.append('\\'); 
           } 
          } else { 
           sb.append('\\'); 
          } 
         } // add other cases here as desired... 
        } 
       } // fall through: \ escapes itself, quotes any character but u 
       sb.append(c); 
      } 
     } catch (Exception e) { 
      System.out.println("Error Generate PDF :: " + e.getStackTrace().toString()); 
      return s; 
     } 
     return sb.toString(); 
    } 

之後,出口字符串PDF - 編碼UTF-8。 但是程序未能顯示越南字符'\ u1ED5'和'\ u1EE9' 輸出成爲「T chc tham gia」 請你告訴我如何解決這個問題? 謝謝:)

回答

2

在官方iText網站上有3 XML Worker examples涉及亞洲語言。他們解析一個包含中文字符的XHTML文件,但應該很容易使它們適用於越南的例子。

您可以找到HTML文件將要在這裏解析:

兩個文件都包含以下內容:

長空(斷劍),秦王殘劍(飛雪),飛雪(月亮),如月(國王)和秦王(天空)。

在第一種情況,一個字體是使用CSS定義:

<span style="font-size:12.0pt; font-family:MS Mincho">長空</span> 

在第二種情況下,沒有特定的字體被定義:

<body><p>長空 (Broken Sword), 秦王殘劍 (Flying Snow), 飛雪 (Moon), 如月 (the King), and 秦王 (Sky).</p></body> 

這些文件包含UTF-8字符,所以我們要分析他們是這樣的:

XMLWorkerHelper.getInstance().parseXHtml(writer, document, 
      new FileInputStream(HTML), Charset.forName("UTF-8")); 

的冷杉你需要的東西是支持越南字符的字體。這是iText無法幫助你的。在你的HTML文件中,你已經定義了Helvetica,但這是一個標準的Type1字體,在使用iText時不會被嵌入,並且不知道如何繪製越南字形。這永遠不會起作用。

第一個示例D07_ParseHtmlAsian將自動搜索名爲MS Mincho的字體。如果發現該字體(例如,因爲您的Windows字體目錄中有msmincho.ttc),字體將顯示在您的PDF中。見hero.pdf。如果沒有找到具有該名稱的字體,那麼字形將不可見,因爲您沒有爲這些字形提供任何字體程序。

第二個示例D07bis_ParseHtmlAsian提供了一種解決方法,以防您在任何地方都沒有MS Mincho。在這種情況下,您必須使用XMLWorkerFontProvider並註冊可以使用的字體,而不是MS Mincho。例如:我們使用存儲在文件中cfmingeb.ttf字體並指定別名MS Mincho

XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); 
fontProvider.register("resources/fonts/cfmingeb.ttf", "MS Mincho"); 

生成的文件asian.pdf是我們所期望的稍有不同,但現在我們至少可以看到中國的字形。

在第三個示例中,HTML文件沒有告訴我們需要使用的任何字體。我們將使用CSS定義是這樣的字體:

CSSResolver cssResolver = new StyleAttrCSSResolver(); 
CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream("body {font-family:tsc fming s tt}".getBytes())); 
cssResolver.addCss(cssFile); 

現在,身體內的所有文本將使用的字體TSC FMing小號TT(存儲在文件中cfmingeb.ttf)。您可以在PDF asian2.pdf中看到差異。

+0

嗨布魯諾,謝謝你的回答。然而,我用BaseFont來解決這個問題** BaseFont bf = BaseFont.createFont(pdfArialFont,BaseFont.IDENTITY_H,BaseFont.EMBEDDED); **。在哪裏,pdfArialFont是一個ttf文件,我放在工作目錄中。 –

+0

該解決方案不僅可以顯示越南語,還可以顯示緬語等等。感謝您開發這個夢幻般的iText:D –

0

我認爲你需要爲你的HTML編碼爲UTF-8,並使用& #xUNUM;對於十六進制或& #NUM;用於嵌入特殊字符的常規代碼。不知道在你的程序中,但某個地方,因爲它沒有顯示出,但你最終的HTML應該是:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML LEVEL 1//EN"> 
<HTML> 
    <HEAD> 
    <TITLE>Your Page Title</TITLE> 
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> 
    </HEAD> 
    <BODY> 
    <!-- YOUR CONTENT HERE --> 

    <td fontfamily="Helvetica" fontstyle="0" fontsize="9" 
     align="0" colspan="48" 
     lineoccupied="1">T&#x1ED5; ch&#x1EE9;c tham gia</td> 

    </BODY> 
</HTML> 

您可以剪切和上述粘貼到一個HTML文件,並查看結果。更多的閱讀樂趣在這裏Unicode and HTML

相關問題