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

时间:2015-07-11 12:27:36

标签: java pdf itext arabic

我需要您帮助显示阿拉伯语内容,并在我尝试创建的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();
    }

}

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

آÙ...ÙÙ,عأإٓكترÙÙ†,Š,

未识别,文字从左到右。那我怎么解决这个问题呢?

2 个答案:

答案 0 :(得分:5)

编码错误:

在源代码中使用非ASCII字符是一种糟糕的编程习惯。例如,您有"الموقع الإلكتروني"。此String应解释为双字节UNICODE字符。但是,当您使用与UNICODE不同的编码保存源代码文件时,或使用不同的编码编译该代码时,或您的JVM时 em>使用不同的编码,每个双字节字符的风险都会被破坏,导致像"الموقع الإلكتروني"

这样的乱码

如何解决这个问题?使用UNICODE表示法:"\u0627\u0644\u0645\u0648\u0642\u0639 \u0627\u0644\u0625\u0644\u0643\u062a\u0631\u0648\u0646\u064a"

请参阅官方文档,免费电子书The Best iText Questions on StackOverflow,您将在此处发现此问题已在此处进行了说明:Can't get Czech characters while generating a PDF

字体错误:

如果您仔细阅读本书,您会发现您的示例可能无效,因为您可能使用了错误的字体。我在回答这个问题时解释了这一点:Arabic characters from html content to pdf using iText

您假设arialbd.ttf可以生成阿拉伯字形。据我所知,只有arialuni.ttf支持阿拉伯语。

错误的方法:

此外,您忽略了这样一个事实,即您只能在ColumnTextPdfPCell对象的上下文中使用阿拉伯语。这在此解释:how to create persian content in pdf using eclipse

例如:

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。

答案 1 :(得分:0)

与PdfTable一起使用时,将以pdf格式打印阿拉伯语文本。以下是代码

Font f = FontFactory.getFont("assets/NotoNaskhArabic-Regular.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    f.setStyle(Font.BOLD);
    f.setColor(new BaseColor(context.getResources().getColor(R.color.colorPrimary)));
   PdfPTable pdfTable=new PdfPTable(1);
   pdfTable.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
   PdfPCell pdfPCell=new PdfPCell();
   pdfPCell.setBorder(Rectangle.NO_BORDER);
   Paragraph paragraph=new Paragraph(string,f);
   paragraph.setAlignment(PdfPCell.ALIGN_LEFT);
   pdfPCell.addElement(paragraph);
   pdfTable.addCell(pdfPCell);
   document.add(pdfTable);

此代码将在您的pdf中添加阿拉伯文本。 pdfPCell.setBorder(Rectangle.NO_BORDER);将提供PdfTable的段落视图 check output of above code