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

时间:2014-02-28 02:58:54

标签: java pdf encoding itext southeast-asian-languages

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

<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();
    }

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

2 个答案:

答案 0 :(得分: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 S TT(存储在文件cfmingeb.ttf中)。您可以在生成的PDF asian2.pdf中看到差异。

答案 1 :(得分:0)

我认为你的HTML需要一个UTF-8编码,并使用&amp; #xUNUM;对于十六进制或&amp; #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