我正在尝试使用此处的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不是。
我不想简单地反转角色,否则我会失去双向支持......
非常感谢
答案 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构建的“图形”方法对我来说似乎很冒险。