使用itext在pdf中编写阿拉伯语

Moh*_*wad 5 android pdf-generation itext

我正在使用itext lib生成PDF文件.我想写阿拉伯语单词.当我运行以下代码时,单词字符反向显示.

使用过的代码:

PdfContentByte cb = docWriter.getDirectContent();
BaseFont bfBold = BaseFont.createFont("assets/arial.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);


createHeadings(cb, document.leftMargin(), 70, "????? ????????: " + tprice + " L.E.");
Run Code Online (Sandbox Code Playgroud)

...

private void createHeadings(PdfContentByte cb, float x, float y, String text){
        cb.beginText();
        cb.setFontAndSize(bfBold, 10);
        cb.setTextMatrix(x,y);
        cb.showText(text.trim());
        cb.endText();
    }
Run Code Online (Sandbox Code Playgroud)

此图像描述了上述代码的输出:http: //i.stack.imgur.com/OLoLo.jpg

Bru*_*gie 7

请查看Ligatures2示例.

你不是忘记了这一行:

cb.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
Run Code Online (Sandbox Code Playgroud)

setRunDirection()当您希望iText从右到左书写文本并在必要时创建连字时,该方法是必需的.此方法也存在于表的上下文中,在这种情况下,您将其应用于PdfPCell对象而不是ColumnText对象.

另外,我不明白你为什么使用这个String:"????? ????????: ".请使用Unicode符号(例如类似的东西"\u0644\u0648\u0631\u0627\u0646\u0633 \u0627\u0644\u0639\u0631\u0628"),因为使用String类似你的符号会产生关于编码和连字的各种混淆.有些编辑器不会使用正确的编码(将文本更改为乱码); 一些编辑将制作连字(这不是iText所期望的).

例如,在你的情况下,我不懂阿拉伯语,所以我不知道是不是"\u0627\u0644\u0633\u0639\u0631 \u0627\u0644\u0627\u062c\u0645\u0627\u0644\u064a""\u064a\u0644\u0627\u0645\u062c\u0627\u0644\u0627 \u0631\u0639\u0633\u0644\u0627"因为我不知道我是否必须开始读取带有值\u0627的字形或带有值的字形\u064a.在任何情况下:iText都希望第一个"角色" String成为人类首先阅读的东西.

请查看ArabicExample示例:

在此输入图像描述

第一行不正确,因为使用时支持RTL或阿拉伯语连字document.add().第二行是正确的(据我所知:我不会读阿拉伯语),因为我用过ColumnText.

这是我使用的代码:

public static final String FONT = "resources/fonts/NotoNaskhArabic-Regular.ttf";
public static final String ARABIC = "\u0627\u0644\u0633\u0639\u0631 \u0627\u0644\u0627\u062c\u0645\u0627\u0644\u064a";

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    Font f = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    Phrase p = new Phrase("This is incorrect: ");
    p.add(new Chunk(ARABIC, f));
    p.add(new Chunk(": 50.00 USD"));
    document.add(p);

    p = new Phrase("This is correct: ");
    p.add(new Chunk(ARABIC, f));
    p.add(new Phrase(": 50.00"));

    ColumnText canvas = new ColumnText(writer.getDirectContent());
    canvas.setSimpleColumn(36, 750, 559, 780);
    canvas.setRunDirection(PdfWriter.RUN_DIRECTION_LTR);
    canvas.addElement(p);
    canvas.go();

    document.close();
}
Run Code Online (Sandbox Code Playgroud)

我使用了a Phrase,但是在使用Paragraph(Paragraphextends Phrase)时可以得到相同的结果.请澄清这是否不能回答您的问题.考虑到StackOverflow上的大多数人都不懂阿拉伯语,所以当你提出问题时以及当你说"它不起作用"时你必须非常明确.由于我们不懂阿拉伯语,我们不知道它应该如何工作.