打印PDF时反转阿拉伯语

时间:2011-03-04 01:50:44

标签: java unicode pdf-generation arabic

我正在尝试使用此处的Java代码在某些PDF文档中打印阿拉伯语: 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 个答案:

答案 0 :(得分:2)

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 :(得分:1)

想出来,这是完整的过程:

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文本是不可能的,因为它是一个图像。我可以忍受。

答案 2 :(得分:0)

Unicode Java(或其他任何东西)在Java程序中始终按逻辑顺序排列。有些PDF是按视觉顺序制作的,尽管这在现代世界中很少见。你引用的程序可能是一个黑客,最终会出于某些目的而起作用的PDF。

如果我是你,我首先会通过一些现代工具检查一些用阿拉伯语制作的PDF文件。

这种用于PDF构建的“图形”方法对我来说似乎很冒险。