Please see Ligatures2 example.
You have not forgotten this line:
cb.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
The setRunDirection() method is required if you want iText to write text from right to left and create ligatures if necessary. This method also exists in the context of tables, in which case you apply it to the PdfPCell object, and not to the ColumnText object.
Also, I don’t understand why you are using this String : "السعر الاجمالي: " . Instead, use Unicode notation (for example, something like "\u0644\u0648\u0631\u0627\u0646\u0633 \u0627\u0644\u0639\u0631\u0628" ), because using a String like yours can create all kinds of confusion regarding coding and ligatures. Some editors will not use the correct encoding (changing the text to gibberish); some editors will do ligatures (this is not what iText expects).
For example, in your case, I don’t know the Arabic language, so I don’t know if it is "\u0627\u0644\u0633\u0639\u0631 \u0627\u0644\u0627\u062c\u0645\u0627\u0644\u064a" or "\u064a\u0644\u0627\u0645\u062c\u0627\u0644\u0627 \u0631\u0639\u0633\u0644\u0627" because I don’t know if I should start reading in the glyph with the value \u0627 or in the glyph with the value \u064a . Anyway: iText expects the first “character” in String be the first thing people read.
Please see ArabicExample example:

The first line is incorrect, since RTL and Arabic ligatures are supported when using document.add() . The second line is correct (as far as I know: I can not read in Arabic), because I used ColumnText .
This is the code I used:
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(); }
I used Phrase , but you can expect the same result when using Paragraph ( Paragraph extends Phrase ). Please clarify whether this answers your question. Keep in mind that most people at StackOverflow do not understand Arabic, so you should be very clear when asking a question and when you say "it does not work." Since we do not know the Arabic language, we do not know how it should work.