14

我尝试过 iText、PDFBox 和 Oracle 表单。在 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:

字体示例的图像

第 1 步)我输入一个古吉拉特语字符串 Google Transliterate。

步骤 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”。但是,每次我得到相同的输出。

4

1 回答 1

1

更新的答案

在您发表评论后,我意识到我错了,即变音符号应该出现在字节序列中的第二个,即使它应该呈现在主要字符的左侧。

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

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

所以,在谷歌音译和你的代码点表示之间的某个地方,这些字符被翻转了。因此,您需要查看您是如何进行翻译的。

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

看起来,一些口译员将“前置基数”放在主辅音之后,而不是之前:

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

所以,如果你能弄清楚这种“翻转”发生在哪里,那么希望你的解决方案能够呈现出来。

希望这可以帮助

于 2012-05-13T13:55:49.440 回答