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

Java 如何使用iText将越南语文本导出为PDF,java,pdf,encoding,itext,southeast-asian-languages,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> T\u1ED5 ch\u1EE9c tham gia 然后使用java从xml文件中获取短语,并使用以下方法将其

我在尝试使用iText将越南文档导出为PDF时遇到了一个问题。 我将越南语单词放在.xml文件中,如下所示

<td fontfamily="Helvetica" fontstyle="0" fontsize="9" align="0" colspan="48" lineoccupied="1">T\u1ED5 ch\u1EE9c tham gia</td>
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 < 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();
    }
public String convertToUnicode(字符串s){
int i=0,len=s.length();
字符c;
StringBuffer sb=新的StringBuffer(len);
试一试{
而(我=4){
c=(char)Integer.parseInt(s.substring(i,i+4),16);
i+=4;
}否则{
某人附加(“\\”);
}
}否则{
某人附加(“\\”);
}
}//根据需要在此处添加其他案例。。。
}
}//失效:\n转义自身,引用除u以外的任何字符
sb.附加(c);
}
}捕获(例外e){
System.out.println(“错误生成PDF::”+e.getStackTrace().toString());
返回s;
}
使某人返回字符串();
}
之后,将字符串导出为PDF编码UTF-8。 但程序无法显示越南语字符“\u1ED5”和“\u1EE9” 输出变为“T chc tham gia” 你能告诉我如何解决这个问题吗?
谢谢:)

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

您的页面标题
Tổ;chứ;塞姆吉亚酒店
您可以将上述内容剪切并粘贴到HTML文件中,然后查看结果。更多的阅读乐趣在这里

在iText官方网站上有3种涉及亚洲语言的语言。他们解析一个包含中文字符的XHTML文件,但将其改编成越南语示例应该很容易

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

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

長空 (断剑),秦王殘劍 (飞雪),飛雪 (月亮),如月 (国王)和秦王 (天空)

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

<span style="font-size:12.0pt; font-family:MS Mincho">長空</span>
您首先需要的是支持越南语字符的字体。这是我不能帮你的。在HTML文件中,您已经定义了Helvetica,但这是一种标准的Type1字体,在使用iText时从未嵌入,并且不知道如何绘制越南语字形。那是行不通的

第一个示例将自动搜索名为
MS Mincho
的字体。如果它找到该字体(例如,因为Windows字体目录中有
msmincho.ttc
),该字体将显示在PDF中。看见如果找不到具有该名称的字体,则标志符号将不可见,因为您没有为这些标志符号提供任何字体程序

第二个示例提供了一种变通方法,以防您在任何地方都没有
MS Mincho
。在这种情况下,您必须使用
XMLWorkerFontProvider
并注册一种可以代替
MS Mincho
使用的字体。例如:我们使用存储在文件
cfmingeb.ttf
中的字体,并分配别名
MS Mincho

XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
fontProvider.register("resources/fonts/cfmingeb.ttf", "MS Mincho");
结果文件与我们预期的略有不同,但现在我们至少可以看到中文字形

在第三个示例中,HTML文件没有告诉我们任何需要使用的字体。我们将使用CSS定义字体,如下所示:

XMLWorkerHelper.getInstance().parseXHtml(writer, document,
            new FileInputStream(HTML), Charset.forName("UTF-8"));
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中看到差异。

你好,布鲁诺,谢谢您的回答。但是,我使用BaseFont解决了这个问题BaseFont bf=BaseFont.createFont(pdfArialFont,BaseFont.IDENTITY,BaseFont.EMBEDDED)。在where中,pdfArialFont是我放在工作目录中的一个ttf文件。这个解决方案不仅可以显示越南语,还可以显示缅甸语等等。感谢您开发这个奇妙的iText:D
CSSResolver cssResolver = new StyleAttrCSSResolver();
CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream("body {font-family:tsc fming s tt}".getBytes()));
cssResolver.addCss(cssFile);