2017-01-11 9 views
0

Я использую itextg lib для создания pdf на моем устройстве Android на хинди. (PDF создается отлично на английском языке).itext android hindi pdf create

Ниже мой код-

Gradle-

compile 'com.itextpdf:itextg:5.5.10' 

Java code-

final String FONT = "file:///android_asset/FreeSans.ttf"; 
Font f = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
String outputString= "\u0915\u093e\u0930 \u092a\u093e\u0930\u094d\u0915\u093f\u0902\u0917"; 
document.add(new Paragraph(outputString,f)); 

Выходная строка взята из IText документации здесь- http://developers.itextpdf.com/examples/font-examples-itext5/language-specific-examples

хинди текст не печатается в формате pdf. Таким образом, строка в outputString не печатается в pdf-файле, поэтому создается.

Заранее спасибо

+0

Отредактированный вопрос, теперь посмотрим, ясно ли это – Sumit

+0

Вы подтвердили, что этот шрифт содержит эти глифы? – mkl

ответ

3

Как я понимаю, у вас есть 2 проблемы:

  1. Я думаю, что файловая система Android не может найти шрифт. Легким испытанием для этого является проверка вывода font.getFamilyname(), который, вероятно, будет unknown. Это означает, что шрифт не найден и что iText по умолчанию имеет значение Helvetica. Helvetica не содержит информации для индийских алфавитов.

  2. Другая проблема заключается в том, что вы не получите правильный результат для этого текста. Особенно кластер \u0930\u094d, являющийся RA + halant, выйдет как र्, регулярный символ RA + знак halant, который вы можете увидеть в правильной записи в конце слова. Диакритику на вершине KA (как в र्क) невозможно достичь в IText 5.

Причина этого заключается в том, что большинство индийских алфавитов, в том числе деванагари, которые вы используете для записи хинди, требуют возможностей OpenType (специфическая возможность определенных типов шрифтов) для правильной визуализации. Это поддерживается только в iText 7 + the pdfCalligraph add-on.

К сожалению, пока нет порта для Android для iText 7, поэтому эта вторая проблема в настоящее время не разрешима.

+0

Ваш первый вопрос верен, но почему этот шрифт может быть пустым? – Sumit

+0

Я не очень хорошо знаком с Android, поэтому не знаю, правильно ли вы загрузили свои ресурсы из файловой системы. Мне было бы лучше добавить шрифт в ресурсы вашего приложения и загрузить его оттуда (если это не означает, что «android_asset» означает, я честно не знаю). – blagae

0

Сначала разместите файл FreeSans.ttf в файле forlder. Библиотека iText берет путь к файлу шрифта, поэтому вы не можете просто указать путь к ним, так как вы не можете напрямую обращаться к папке с ресурсами. Ниже приведен код для копирования файла шрифта из папки активов в локальный каталог вашего приложения.

public static final String HINDI_FONT = "FreeSans.ttf"; 
try { 
    File file = new File(getFilesDir(), HINDI_FONT); 
    if (file.length() == 0) { 
     InputStream fs = getAssets().open(HINDI_FONT); 
     FileOutputStream os = new FileOutputStream(file); 
     int i; 
     while ((i = fs.read()) != -1) { 
     os.write(i); 
     } 
     os.flush(); 
     os.close(); 
     fs.close(); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Выполнение кода блока try в отдельном потоке, не делайте этого в основном потоке. Оператор if гарантирует, что это произойдет только один раз. Пожалуйста, напишите инструкции закрытия потока в блоке finally вместо блока try, как показано выше.

Далее идет IText заявления использовать шрифт

Font f = FontFactory.getFont(getFilesDir() + "/" + HINDI_FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
PdfPCell eCell = new PdfPCell(new Phrase(entry, f)); 
eCell.setPadding(5); 
table.addCell(eCell); 

Здесь запись Название переменной ваш Hindi текст и код написан в деятельности так getFilesDir() работает. Я добавил фразу в ячейку таблицы. Вы также можете использовать его в абзаце. Я проверил этот код, и он работает.

+0

его работа..thanks! –