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 ответ
Решение
Различные проблемы могут быть в игре.
- Кодировка: Вы помещаете арабский текст в свой исходный код. Если вы сохраните свой Java-файл, используя неправильную кодировку, этот текст будет поврежден. Если вы скомпилируете свой Java-файл, используя неправильную кодировку, этот текст будет поврежден. И так далее. Я надеюсь, вы поняли идею. Храните буквальный текст следующим образом:
"\u0644\u0648\u0631\u0627\u0646\u0633 \u0627\u0644\u0639\u0631\u0628"
чтобы избежать таких проблем. - Как описано в главе 11 моей книги, письма справа налево и арабские лигатуры поддерживаются только в контексте
PdfPCell
а такжеColumnText
, Я вижу, что вы используетеPdfPCell
, но я не вижу, чтобы вы использовалиcell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
в любом месте. Это неверно. - Вы используете объект
fontNormal
, но вы не говорите нам, какой шрифт вы на самом деле используете. Например: если вы используете стандартный шрифт Type1 Helvetica, текст не будет отображаться, потому что Helvetica не знает, как отображать арабский текст.
Поправка: вы обновили свой вопрос, показывая, что вы используете "arialuni.ttf"
, Однако вы используете неправильную кодировку: CP1252 - кодировка латинского алфавита. Вы должны использовать BaseFont.IDENTITY_H
,
Обновление: глядя на обновление вашего вопроса, а также на дополнительный комментарий, я вижу две основные ошибки.
- Вы предполагаете, что название шрифта
"arialuni.ttf"
, Это файл шрифта, но не имя шрифта. Также: вы спрашиваетеFontFactory
для этого шрифта, но вы сказалиFontFactory
где искать шрифты? Вы уверены, чтоFontFactory
может найтиc:/windows/fonts/
или какой-либо каталог файлarialuni.ttf
хранится. - Вы объявляете шрифт, но не используете его:
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);
Результат выглядит так (увеличено):