当前位置: 首页 > 面试题库 >

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

裴楚青
2023-03-14
问题内容

尝试使用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”。能否请您告诉我如何解决此问题?谢谢 :)


问题答案:

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

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

  • hero.html
  • hero2.html

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

长空(断剑),秦王残剑(Flying Snow),飞雪(Moon),如月(King)和秦王(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。如果找到该字体(例如,因为您msmincho.ttc在Windows字体目录中,则该字体会显示在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中看到差异。



 类似资料:
  • 问题内容: 我想通过iText将Swing JComponent打印到pdf。 不幸的是,PDF文件中未显示任何内容。你知道如何解决这个问题吗? 问题答案: 我已经弄清楚添加addNotify和验证帮助。

  • 当尝试使用将文件转换为文件时,会出现以下异常: RuntimeException:Scanline必须以EOL代码字开头。在com.itextpdf.text.pdf.codec.tifffaxdecoder.readeol(tifffaxdecoder.java:1303),在com.itextpdf.text.pdf.codec.tifffaxdecoder.decode2d(tifffaxd

  • 问题内容: 在熊猫中为数据框生成PDF的有效方法是什么? 问题答案: 一种方法是使用markdown。您可以使用。这会将数据框转换为html表。从那里,您可以将生成的html放入markdown文件(.md)(请参阅http://daringfireball.net/projects/markdown/basics)。从那里开始,有一些实用程序可以将markdown转换为pdf(https://w

  • 问题内容: 我的表格格式 我在网上找到了以下代码。但是,如果我使用“ thead”和“ tbody”标签,那是行不通的 问题答案: 您在Internet上找到的解决方案无法正常工作的原因是因为线路开始。该变量只有两个元素,是和。该行正在寻找内的所有元素是。你能做的最好的事情就是给一个id你和然后抓住所有基于该值。说您有: 然后对标记执行相同的操作 编辑:我也强烈建议使用jQuery。它将缩短为:

  • 谢谢你的帮助。。。 在将html表格标签/片段(我已转换为字符串)转换为PDF文档时... 我能够使用此技术成功地将css样式应用于PDF文档。。。 但是,我没有成功地使用现有的css文件(即,使用CssFile对象)将css应用于PDF文档,如下所示。。。 。。。我一直无法让这个工作,不知道是什么问题。。。我正在。。。 如何正确使用CssFile和CssResolver将css样式——即从现有的

  • 这是我的代码: 在VS代码终端中打印: 如何修复它,以便VS Code终端正确显示文本?