如何在使用iText创建的PDF中显示阿拉伯语
我需要您的帮助来显示阿拉伯语内容,并在我尝试创建的PDF示例中从右到左开始编写。 以下是示例代码:
public static void main(String[] args) throws IOException { try { BaseFont ArialBase = BaseFont.createFont("C:\\Users\\dell\\Desktop\\arialbd.ttf", BaseFont.IDENTITY_H, true); Font ArialFont = new Font(ArialBase, 20); Document document = new Document(PageSize.LETTER); PdfWriter.getInstance(document, new FileOutputStream("C:\\Users\\dell\\Desktop\\HelloWorld.pdf")); document.setMargins(72f, 72f, 72f, 0f); document.open(); document.add(new Paragraph("الموقع الإلكتروني,",ArialFont)); document.close(); System.out.println("PDF Completed"); } catch (DocumentException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } }
使用上面的代码,阿拉伯文本将显示如下:
آمÙÙ,عأإٓكترÙÙ†,Š,
这是不明的,文字是从左到右。 那我怎么解决这个问题呢?
编码错误:
在源代码中使用非ASCII字符是一种糟糕的编程习惯。 例如,你有"الموقع الإلكتروني"
。 该String
应解释为双字节UNICODE字符。 但是,当您使用与UNICODE不同的编码保存源代码文件时,或者使用不同的编码编译该代码时,或者当您的JVM使用不同的编码时,每个双字节字符都有可能被破坏,导致诸如"الموقع الإلكتروني"
怎么解决这个? 使用UNICODE表示法: "\u0627\u0644\u0645\u0648\u0642\u0639 \u0627\u0644\u0625\u0644\u0643\u062a\u0631\u0648\u0646\u064a"
请参阅官方文档,免费电子书StackOverflow上的最佳iText问题 ,您将在此处发现此问题已在此处描述: 生成PDF时无法获取捷克语字符
字体错误:
如果您仔细阅读本书,您会发现您的示例可能无效,因为您可能使用了错误的字体。 在我对这个问题的回答中解释了这一点: 使用iText从html内容到pdf的阿拉伯字符
您假设arialbd.ttf
可以生成阿拉伯字形。 据我所知,只有arialuni.ttf
支持阿拉伯语。
错误的做法:
此外,您忽略了这样一个事实,即您只能在ColumnText
和PdfPCell
对象的上下文中使用阿拉伯语。 这里解释了: 如何使用eclipse在pdf中创建波斯语内容
例如:
BaseFont bf = BaseFont.createFont( "c:/windows/fonts/arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); Font font = new Font(bf, 20); ColumnText column = new ColumnText(writer.getDirectContent()); column.setSimpleColumn(36, 730, 569, 36); column.setRunDirection(PdfWriter.RUN_DIRECTION_RTL); column.addElement(new Paragraph( "\u0627\u0644\u0645\u0648\u0642\u0639 \u0627\u0644\u0625\u0644\u0643\u062a\u0631\u0648\u0646\u064a", font)); column.go();
请注意,我使用的是Identity-H
编码,因为涉及UNICODE。