PdfPcell пустой вывод арабских строк

У меня есть эта часть кода:

//Staff
// Title font
BaseFont titleBf = null;
try {
titleBf = BaseFont.createFont(BaseFont.TIMES_ROMAN,BaseFont.CP1252, BaseFont.EMBEDDED);
} catch (IOException e) {
System.out.println(e.getMessage());
}
com.itextpdf.text.Font titleFont = new com.itextpdf.text.Font(titleBf,24);
titleFont.setColor(new BaseColor(0, 0, 204));
/*
 * Pdf creation
*/
Document document = new Document();
PdfWriter.getInstance(document,new FileOutputStream(fc.getSelectedFile() + ".pdf"));
document.open();

/*
* Title
*/
Paragraph p = new Paragraph("مرحبا بكم",titleFont);
p.setSpacingAfter(20);
p.setAlignment(1); // Center
document.add(p);
//Staff
document.close();

Выход был пустым. Даже когда я пытался добавить простой pdfpcellЯ получил тот же результат, вот способ:

com.itextpdf.text.Font fontNormal = FontFactory.getFont(
                ("arialuni.ttf"), BaseFont.CP1252, BaseFont.EMBEDDED,
                8, com.itextpdf.text.Font.NORMAL);

Chunk chunkArabic = new Chunk("مرحبا العالم", fontNormal);
infoTab.addCell(new PdfPCell(new Phrase(chunkArabic)));
document.add(infoTab);

1 ответ

Решение

Различные проблемы могут быть в игре.

  1. Кодировка: Вы помещаете арабский текст в свой исходный код. Если вы сохраните свой Java-файл, используя неправильную кодировку, этот текст будет поврежден. Если вы скомпилируете свой Java-файл, используя неправильную кодировку, этот текст будет поврежден. И так далее. Я надеюсь, вы поняли идею. Храните буквальный текст следующим образом: "\u0644\u0648\u0631\u0627\u0646\u0633 \u0627\u0644\u0639\u0631\u0628" чтобы избежать таких проблем.
  2. Как описано в главе 11 моей книги, письма справа налево и арабские лигатуры поддерживаются только в контексте PdfPCell а также ColumnText, Я вижу, что вы используете PdfPCell, но я не вижу, чтобы вы использовали cell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL); в любом месте. Это неверно.
  3. Вы используете объект fontNormal, но вы не говорите нам, какой шрифт вы на самом деле используете. Например: если вы используете стандартный шрифт Type1 Helvetica, текст не будет отображаться, потому что Helvetica не знает, как отображать арабский текст.

Поправка: вы обновили свой вопрос, показывая, что вы используете "arialuni.ttf", Однако вы используете неправильную кодировку: CP1252 - кодировка латинского алфавита. Вы должны использовать BaseFont.IDENTITY_H,

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

  1. Вы предполагаете, что название шрифта "arialuni.ttf", Это файл шрифта, но не имя шрифта. Также: вы спрашиваете FontFactory для этого шрифта, но вы сказали FontFactory где искать шрифты? Вы уверены, что FontFactory может найти c:/windows/fonts/ или какой-либо каталог файл arialuni.ttf хранится.
  2. Вы объявляете шрифт, но не используете его: Paragraph p = new Paragraph("\u062D\u064A\u0633\u0648"); создает Paragraph используя шрифт по умолчанию.

Это код, который работает:

BaseFont bf = BaseFont.createFont(
    "c://windows/fonts/arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font = new Font(bf, 8);
PdfPTable table = new PdfPTable(1);
PdfPCell  cell = new PdfPCell(new Phrase("\u062D\u064A\u0633\u0648", font));
cell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
table.addCell(cell);
document.add(table);

Результат выглядит так (увеличено):введите описание изображения здесь

Другие вопросы по тегам