java - 如何使 Itext 接受具有如下序列的 unicode

标签 java swing javafx itext

如何使 Itext 库接受 unicode,如下所示。实际上它使用 java 控制台打印一个印地文字符串。但我试图通过 itext 接受它以便做出报告。

u0915\u093e\u0930 \u092a\u093e\u0930\u094d\u0915\u093f\u0902\u0917

下面是我正在使用的代码片段

BaseFont unicode = BaseFont.createFont("/home/mani/Downloads/arialuni.ttf", 
    BaseFont.IDENTITY_H,    BaseFont.EMBEDDED);
Font font=new Font(unicode,12,Font.NORMAL,new BaseColor(50,205,50));
table = new PdfPTable(new float[] { 10, 60, 30 });
table.setWidthPercentage(100);
PdfPCell customerLblCell = new PdfPCell(new Phrase("CUSTOMERS",
    this.headerFont));
PdfPCell balanceLblCell = new PdfPCell(new Phrase(
    "\u0915\u093e\u0930\u092a\u093e\u0930\u094d\u0915\u093f\u0902\u0917", font));

但它再次无法识别文本。 预期:-कारपार्किंग

最佳答案

我假设您希望输出看起来像此屏幕截图中的第一行:

enter image description here

此屏幕截图取自文件 hindi.pdf ,使用 HindiExample 创建示例:

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    Font f = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, true);
    Paragraph p1 = new Paragraph("\u0915\u093e\u0930 "
            + "\u092a\u093e\u0930\u094d\u0915\u093f\u0902\u0917", f);
    document.add(p1);
    Paragraph p2 = new Paragraph("\\u0915 \u0915 \\u093e \u093e \\0930 \u0930\n"
            + "\\u092a \u092a \\u093e \u093e \\u0930 \u0930 \\u094d \u094d"
            + "\\u0915 \u0915 \\u093f \\u093f \u093f \\u0902 \u0902"
            + "\\u0917 \u0917", f);
    document.add(p2);
    document.close();
}

您的问题并不完整,因为您没有向我们展示您正在使用哪种字体(在我的例子中 FONTFreeSans.ttf),也没有哪种编码(应该是 IDENTITY_H)。

如果您期待屏幕截图的第一行,我的答案是双重的:

  1. 使用知道如何呈现印地语的字体(例如 FreeSans.ttf、arialuni.ttf...),
  2. 使用正确的编码 (Identity-H)。

或者也许问题更微不足道:您忘记了第一个 u 之前的 \ 字符。

如果您期待其他内容,,请查看第二行和第三行,我在其中插入了 Unicode 值,并在每个 Unicode 字符前面插入了一个空格。您会注意到每个字符都正确呈现,但是没有进行连字。如果您需要连字,则需要等待 iText 的下一个主要版本,它将带来对印地语的支持,但该支持不会作为开源软件提供。 (我们注意到太多开发人员在没有商业许可的情况下使用 iText,因此我们将仅提供一些闭源组件。)

更新:

您已经更新了您的问题,但您再次没有提供 SSCCE这使得人们能够重现问题。当我完成你的代码时,我得到这个结果:

enter image description here

这是我的代码:

BaseFont unicode = BaseFont.createFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font=new Font(unicode,12,Font.NORMAL,new BaseColor(50,205,50));
PdfPTable table = new PdfPTable(new float[] { 10, 60, 30 });
table.setWidthPercentage(100);
PdfPCell customerLblCell = new PdfPCell(new Phrase("CUSTOMERS"));
PdfPCell balanceLblCell = new PdfPCell(new Phrase("\u0915\u093e\u0930\u092a\u093e\u0930\u094d\u0915\u093f\u0902\u0917", font));
table.addCell(customerLblCell);
table.addCell(balanceLblCell);
table.completeRow();
table.setSpacingBefore(10);
document.add(table);

我还在线更新了示例:HindiExample

你的代码中缺少什么?您创建一个包含 3 列的表格,并创建 2 个单元格。我没有看到您将单元格添加到表格中的任何位置,也没有看到单元格3。因此,即使您将两个单元格添加到表格中,它们也不会被渲染,因为 iText 会丢弃不完整的行(除非您使用 completeRow() 方法)。

我使用这个字体:FreeSans.ttf (您可以下载here)。我也用 MS Arial Unicode (arialuni.ttf) 尝试过,这给了我以下结果:

enter image description here

简而言之:您关于 iText 无法识别 Unicode 的指控是错误的。有充足的示例证明 Unicode 可以正确呈现(使用 FreeSans MS Arial Unicode)。

关于java - 如何使 Itext 接受具有如下序列的 unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33733432/

相关文章:

java - 错误: Could not find HelloAndroid. APK

尽管在后台线程中加载许多图像,但 JavaFX 应用程序会卡住几秒钟

java - JavaFX CSS 中行高的类比

java - 放置n个点同时最大化最小距离

java - 如何将 servlet 的响应发送到客户端?

java - 简单的 Java Swing 动画滞后

java - 如何从 Java Swing 中附加的面板中删除该面板?

css - 如何影响 JavaFX 超链接中的行间距?

java - 我如何在 JBoss 中创建全局上下文变量?

java - 在动态 JPanel 中添加 JScrollPane