RTL not working in pdf generation with itext 5.5 for Arabic text
arabic, itext, java, right-to-left, xmlworker
Solution
As documented, this is not supposed to work:
writer.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
Arabic (and Hebrew) can only be rendered correctly in the context of `ColumnText` and `PdfPCell`. In other words: if you want to use Arabic from XML Worker, you need to create an `ElementList` and then add the elments to a `ColumnText` object as is done here.
You need to set the run direction at the level of the `ColumnText` object.
Problem
I have java code that writes arabic characters with the help of itext 5.5 and xmlworker jars, but its writing left to right even after writer.setRunDirection(PdfWriter.RUN_DIRECTION_RTL) is used. Code used is: ``` public class CreateArabic extends DefaultHandler { /** Paths to and encodings of fonts we're going to use in this example */ public static String[][] FONTS = { {"C:/arialuni.ttf", BaseFont.IDENTITY_H}, {"C:/abserif4_5.ttf", BaseFont.IDENTITY_H}, {"C:/damase.ttf", BaseFont.IDENTITY_H}, {"C:/fsex2p00_public.ttf", BaseFont.IDENTITY_H} }; /** Holds he fonts that can be used for the peace message. */ public FontSelector fs; public CreateArabic() { fs = new FontSelector(); for (int i = 0; i < FONTS.length; i++) { fs.addFont(FontFactory.getFont(FONTS[i][0], FONTS[i][1], BaseFont.EMBEDDED)); } } public static void main(String args[]) { try { // step 1 Rectangle pagesize = new Rectangle(8.5f * 72, 11 * 72); Document document = new Document();//pagesize, 72, 72, 72, 72);// step1 PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("c:\\report.pdf")); writer.setInitialLeading(200.5f); //writer.getAcroForm().setNeedAppearances(true); //writer.setRunDirection(PdfWriter.RUN_DIRECTION_RTL); document.open(); FontFactory.registerDirectories(); Font font = FontFactory.getFont("C:\\damase.ttf", BaseFont.IDENTITY_H, true, 22, Font.BOLD); // step 3 document.open(); // step 4 XMLWorkerHelper helper = XMLWorkerHelper.getInstance(); // CSS CSSResolver cssResolver = new StyleAttrCSSResolver(); CssFile cssFile = helper.getCSS(new FileInputStream( "D:\\Itext_Test\\Test\\src\\test.css")); cssResolver.addCss(cssFile); // HTML XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(); // fontProvider.addFontSubstitute("lowagie", "garamond"); CssAppliers cssAppliers = new CssAppliersImpl(fontProvider); HtmlPipelineContext htmlContext = new HtmlPipelineContext( cssAppliers); htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory()); // // Pipelines PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer); HtmlPipeline html = new HtmlPipeline(htmlContext, pdf); CssResolverPipeline css = new CssResolverPipeline(cssResolver, html); writer.setRunDirection(PdfWriter.RUN_DIRECTION_RTL); System.out.println("RUN DIRECTION --> "+writer.getRunDirection()); XMLWorker worker = new XMLWorker(css, true); XMLParser p = new XMLParser(worker,Charset.forName("UTF-8")); String htmlString2 = "<html><body style=\"color:red;\">Hello"+"??"+"</body></html>"; String htmlString = "<body style='font-family:arial;'>h"+"??"+"<p style='font-family:arial;' > ????? </p></body>"; String html1 ="<html><head></head><body>Hello <p style=\"color:red\" >oo ??</p> World! \u062a\u0639\u0637\u064a \u064a\u0648\u0646\u064a\u0643\u0648\u062f \u0631\u0642\u0645\u0627 \u0641\u0631\u064a\u062f\u0627 \u0644\u0643\u0644 \u062d\u0631\u0641 "+htmlString+"Testing</body></html>"; ByteArrayInputStream is = new ByteArrayInputStream(htmlString.getBytes("UTF-8")); p.detectEncoding(is); p.parse(is, Charset.forName("UTF-8"));//.parse(is, "UTF-8");//parse(is);//ASMO-708 // step 5 document.close(); } catch (Exception ex) { ex.printStackTrace(); } } } ``` Output file is also attached.