перевернутый арабский при печати PDF - PullRequest
3 голосов
/ 04 марта 2011

Я пытаюсь напечатать арабский в некоторых документах 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 нет.

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

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

Ответы [ 3 ]

2 голосов
/ 07 марта 2011

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

Ах!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, арабские и латинские символы, поэтому должно иметь два изменения направления.

Удачи.

1 голос
/ 04 марта 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-текст, так как это изображение.Я могу жить с этим.

0 голосов
/ 04 марта 2011

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

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

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

...