Какой API-интерфейс для создания PDF файлов (Java) поддерживает шрифт Gujarati?

Я пробовал iText, PDFBox и Oracle Forms. И я также добился успеха в iText для создания PDF-документа Gujarati. Но, к сожалению, он не создает правильный шрифт на языке Gujarati (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) Я печатаю строку gujarati String Google Transliterate.

Шаг 2). Я конвертирую его в unicode с помощью BableMap Software, чтобы использовать его с помощью пакета ресурсов.

Проблема: Позвольте мне создать строку: બિલાડી (Biladi)

Это unicode будет:\u0AAC \u0ABF\u0AB2\u0ABE\u0AA1\u0AC0

Отметьте выделение полужирным шрифтом Юникод. Вот где я получаю проблему. Теперь, если я изменю этот юникод на \u0ABF\u0AAC\u0AB2\u0ABE\u0AA1\u0AC0, он печатает правильный вывод в формате PDF.

В то же время он выводит неверный вывод в формате HTML: િબલાડી

Мне нужно управлять между ними.

Я пробовал использовать "gu" и "gu.UTF-8" и "UTF-8". Но каждый раз я получаю одинаковый вывод.

Ответы

Ответ 1

Обновленный ответ

После вашего комментария я понял, что я ошибался, т.е. диакритический символ должен появиться вторым в последовательности байтов, хотя он должен отображаться слева от главного символа.

Итак, оказывается, iText не поддерживает этот тип рендеринга на индикативных символах. Грубо говоря, iText использует awt Graphics2D для визуализации нелатинских символов Unicode, один за другим, в виде изображений в PDF. (Я думаю, это потому, что соответствующие шрифты не обязательно устанавливаются на всех компьютерах). Эта особенность не учитывает этот особый порядок.

iText поддерживает аналогичное поведение для арабского языка, используя класс, предоставленный другим разработчиком. См. com.itextpdf.text.pdf.ArabicLigaturizer. Возможно, вы сами могли бы создать подобный? (!)

Похоже, что это произошло раньше:

Оригинальный ответ

Кем чхо,

Я считаю, что iText отображает правильные символы, но первые 2 символа вашего ввода были "перевернуты", прежде чем перевести строку в юникодные точки. Таким образом, проблема возникла до того, как данные даже попали в iText.

Основная проблема заключается в том, что символ "первый" является символом "pre-base", который является типом Diacritic. Это немного похоже на "акцент" в европейских текстах, поскольку он не может существовать сам по себе, и его целью является украшение другого персонажа. В этом случае он превращает "Ba" (બ) в "Bi".

Вы увидите int the Unicode Codepage, что первый символ (િ) действительно имеет кодовую точку \u0ABF, а второй (બ) -\u0AAC: http://en.wikipedia.org/wiki/Gujar%C4%81ti_script#Unicode

Итак, где-то между Google Transliterate и вашим кодовым представлением эти символы перевернулись. Итак, вам нужно просмотреть, как вы сделали этот перевод.

Как вы преобразовали эти символы в кодовые страницы?

По-видимому, некоторые интерпретаторы помещают "предварительную базу" после основного согласного, а не перед ним:

  • Обратите внимание, что когда вы вставляете эти символы в (Linux) терминал, первые 2 персонажа выходят назад. Я что-то верю подобное случилось и для вас.
  • Вы также заметите, что при попытке редактируя это слово в Google Transliterate, вы не можете поместить курсор между первые 2 символа, а когда вы нажмете backspace, слева символ удаляется перед правом.

Итак, если вы можете решить, где произошло это "перевертывание", то, надеюсь, ваше решение представится.

Надеюсь, что это поможет