如何使用iText将越南文本导出为PDF

尝试使用iText将越南文档导出为PDF时,我遇到了问题。 我把越南语单词放在.xml文件中就像这样

T\u1ED5 ch\u1EE9c tham gia 

然后让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 = 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(); } 

之后,将String导出为PDF – 编码UTF-8。 但该程序未能显示越南字符’\ u1ED5’和’\ u1EE9’输出变为“T chc tham gia”你能告诉我如何解决这个问题吗? 谢谢 :)

在iText官方网站上有3个涉及亚洲语言的XML Worker示例 。 它们解析包含中文字符的XHTML文件,但应该很容易使它们适应越南语的例子。

您可以在此处找到要解析的HTML文件:

  • hero.html
  • hero2.html

这两个文件都包含以下文本:

长空(Broken Sword),秦王残剑(Flying Snow),飞雪(Moon),如月(国王)和秦王(Sky)。

在第一种情况下,使用CSS定义字体:

 長空 

在第二种情况下,没有定义特定字体:

 

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

这些文件包含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 S TT(存储在文件cfmingeb.ttf )。 您可以在生成的PDF asian2.pdf中看到差异。

我认为你的HTML需要一个UTF-8编码,并使用&#xUNUM; 对于hex或&#NUM; 用于常规代码以嵌入您的特殊字符。 不确定程序中的某个位置,因为它没有显示,但最终的HTML应该是:

    Your Page Title     Tổ chức tham gia   

您可以将上述内容剪切并粘贴到HTML文件中并查看结果。 更多的阅读乐趣在于Unicode和HTML