如何在使用iText创建的PDF中显示阿拉伯语

99m*_*aas 0 java pdf arabic itext

在显示阿拉伯语内容以及在我尝试创建的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();
    }

}
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,阿拉伯文本将显示如下:

الموقعالإ¥„كتروني,

身份不明,文字从左到右。那么我该如何解决呢?

Bru*_*gie 5

编码错误:

在源代码中使用非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支持阿拉伯语。

错误的方法:

此外,您忽略了一个事实,即您只能在ColumnTextPdfPCell对象的上下文中使用阿拉伯语。此处说明:如何使用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();
Run Code Online (Sandbox Code Playgroud)

请注意,Identity-H由于涉及UNICODE ,因此我正在使用编码。