перевернутый арабский язык при печати PDF

Я пытаюсь напечатать арабский язык в некоторых документах PDF, используя код Java, найденный здесь: http://www.java2s.com/Code/Java/PDF-RTF/ArabicTextinPDF.htm

Пример отлично работает, за исключением того, что текст выходит задом наперед. Например, немного изменив пример:

String txt = "\u0623\u0628\u062c\u062f\u064a\u0629 \u0639\u0631\u0628\u064a\u0629";
System.out.println(txt);
g2.drawString(txt, 100, 30);

На экране печатаются те же символы, но в противоположном направлении по сравнению с PDF. Вывод консоли правильный, PDF нет.

Я не хочу просто менять местами символы, иначе я потеряю двунаправленную поддержку...

Спасибо большое


person ianaré    schedule 04.03.2011    source источник


Ответы (3)


IIRC, iText поддерживает формирование арабского языка на более высоком уровне, чем drawString. Посмотрим здесь...

Ah! ColumnText.showTextAligned(PdfContentByte canvas, int alignment, Phrase phrase, float x, float y, float rotation, int runDirection, int arabicOptions)

Мировоззрение является одним из Element.ALIGN_*. Направление выполнения — одно из PdfWriter.RUN_DIRECTION_*. Арабские опции - это битовые флаги, ColumnText.AR_*

Это должно помочь, с одной оговоркой: я не уверен, что он будет обрабатывать несколько направлений в одной и той же фразе. В вашей тестовой строке есть символы CJKV, арабские и латинские символы, поэтому должно быть изменение направления в двух направлениях.

Удачи.

person Mark Storer    schedule 07.03.2011

Разобрался, вот весь процесс:

document.open();
java.awt.Font font = new java.awt.Font("times", 0, 30);
PdfContentByte cb = writer.getDirectContent();
java.awt.Graphics2D g2 = cb.createGraphicsShapes(PageSize.A4.width(), PageSize.A4.height());
g2.setFont(font);
String txt = "日本人 أبجدية عربية Dès Noël où";
System.out.println(txt);
java.awt.font.FontRenderContext frc = g2.getFontRenderContext();
java.awt.font.TextLayout layout = new java.awt.font.TextLayout(txt, font, frc);
layout.draw(g2, 15, 55);
g2.dispose();
document.close();

Вы заметите, что он поддерживает несколько языков с двунаправленной поддержкой. Единственное, невозможно скопировать/вставить полученный текст PDF, так как это изображение. Я могу жить с этим.

person ianaré    schedule 04.03.2011
comment
Собственно, это ПУТИ. Это может привести к ужасно раздутому PDF-файлу в зависимости от того, сколько текста вы пропустите с помощью этого метода. PS: Это старый код. Проверьте мой ответ выше. - person Mark Storer; 07.03.2011

Юникод арабский (или любой другой) всегда находится в логическом порядке в программе Java. Некоторые PDF-файлы сделаны в визуальном порядке, хотя в современном мире это довольно редко. Программа, которую вы цитируете, может быть хаком, который в конечном итоге работает с PDF-файлами для некоторых целей.

На вашем месте я бы начал с изучения некоторых PDF-файлов, созданных на арабском языке с помощью какого-нибудь современного инструмента.

Такой «графический» подход к созданию PDF-файлов кажется мне в лучшем случае рискованным.

person bmargulies    schedule 04.03.2011
comment
Да, я знаю, что это довольно хакерский. Проблема в том, что все другие инструменты, которые я видел, не будут делать правильные лигатуры (?) между буквами. Кроме того, буквы будут немного меняться в зависимости от размещения слов, и это еще одна проблема, с которой я сталкивался в различных других библиотеках. Пока это самое близкое, что я нашел к тому, что правильно отображается. Если вы знаете какие-либо хорошие библиотеки на Java, PHP или python, которые могут правильно обрабатывать арабский язык, я весь слушаю. - person ianaré; 04.03.2011