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

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

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

最佳答案

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

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

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

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

在第一种情况下,使用 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 中看到差异.

关于java - 如何使用 iText 将越南语文本导出为 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22085316/

相关文章:

java - 管理大型 PDF 存储和流式传输

c# - ABCpdf转换html anchor 跳转到同一个PDF中的另一个页面

java - 设置所需的字符串长度

java - Selenium - 单击切换元素

java - 以天、时、分、秒显示期间

javascript - fswebcam : getting a dataURI via Node. js

go - Base64 编码不会因无效字符而失败

java - 使用 DocumentListener 替换

ruby - 解析PDF去除月份

java - 如何为 win32 配置 rcp 产品以在控制台上正确打印德语变音符号?