哪个PDF生成API(Java)支持古吉拉特字体?

2022-09-04 04:55:18

我尝试过iText,PDFBox和Oracle Forms。我还在iText的情况下成功生成了古吉拉特语PDF文档。但是,不幸的是,它没有在古吉拉特语(UTF-8)语言中生成正确的字体。

我的项目在jdk 1.4中,这是强制性的。因此,我需要支持古吉拉特字体的旧版API。

请建议是否有任何选项可用。

示例代码:

public void GeneratePDFusingiText(String lStrGujaratidata)
  {
    try
    {

      BaseFont bf = BaseFont.createFont("C:\\Windows\\Fonts\\Shruti.ttf",  BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
      Font font = new Font(bf, 12);
      Document document = new Document();
      PdfWriter.getInstance(document, new FileOutputStream("D:/GeneratePDFusingiText.pdf"));
      document.open();
      document.add(new Paragraph(lStrGujaratidata, font));
      document.close();
    }
    catch(Exception e)
    {
      System.out.println("Exception while generating PDF");
      e.printStackTrace();
    }
   } 

编辑1:

也许图像没有得到显示。它上传到这里

编辑2:

image of font examples

步骤-1)我键入一个古吉拉特语字符串谷歌音译。

步骤-2)我使用BableMap软件将其转换为Unicode,以使用Resourse Bundle使用它。

问题:让我有一个字符串:બિલાડી(Biladi)

它的 unicode 将是 : \u0AAC \u0ABF\u0AB2\u0ABE\u0AA1\u0AC0

检查上面的粗体 Unicode 字符。这就是我遇到问题的地方。现在,如果我将此 unicode 更改为 \u0ABF\u0AAC\u0AB2\u0ABE\u0AA1\u0AC0,它将以 PDF 格式打印正确的输出。

同时,它在HTML中打印错误的输出,即:િબલાડી

我必须在他们之间进行管理。

我尝试过使用“gu”和“gu”。UTF-8“ & ”UTF-8”。但是,每次我都会得到相同的输出。


答案 1

更新的答案

在您的评论之后,我意识到我错了,即变音符号字符应该出现在字节序列的第二位,即使它应该被呈现在主角的左侧。

因此,事实证明,iText不支持在印度字符集上进行这种类型的渲染。粗略地说,iText使用awt将非拉丁Unicode字符逐个呈现为PDF中的图像。(我想这是因为适当的字体不一定安装在每个人的计算机上)。此功能不考虑此特殊订购。Graphics2D

iText 确实支持阿拉伯语的类似行为,使用其他开发人员贡献的类。请参阅com.itextpdf.text.pdf.ArabicLigaturizer。也许你可以自己创建一个类似的?(!)

看起来这之前已经出现过:

原始答案

金哲,

我相信iText显示的是正确的字符,但是在您将字符串转换为unicode点之前,您输入的前2个字符已被“翻转”。因此,问题甚至在数据到达iText之前就发生了。

根本问题是“第一个”字符是“前基”字符,这是一种变音符号。这有点像欧洲文本中的“口音”,因为它不能单独存在,其目的是修饰另一个角色。在这种情况下,它将“Ba”(બ)变成“Bi”。

您将在 Unicode 代码页中看到,第一个字符 (િ) 确实是代码点 \u0ABF,第二个字符 (બ) 是 \u0AAC :http://en.wikipedia.org/wiki/Gujar%C4%81ti_script#Unicode

因此,在Google音译和代码点表示之间,这些字符被翻转了。因此,您需要查看如何进行该翻译。

您是如何将这些字符转换为代码点的?

似乎,一些解释器将“前基”放在主辅音之后,而不是在它之前:

  • 请注意,当您将这些字符粘贴到 (Linux) 终端中时,前 2 个字符从后到前出现。我相信你也发生了类似的事情。
  • 您还会注意到,当您尝试在Google音译中编辑此单词时,您无法将光标放在前2个字符之间,并且当您点击退格键时,左侧字符会先于右侧删除。

因此,如果您可以找出这种“翻转”发生的位置,那么希望您的解决方案能够呈现出来。

希望这有帮助


答案 2

推荐