Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RTL not working in pdf generation with itext 5.5 for Arabic text

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.PDF Output

like image 425
sheena Avatar asked Oct 15 '25 17:10

sheena


1 Answers

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.

like image 76
Bruno Lowagie Avatar answered Oct 17 '25 07:10

Bruno Lowagie



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!