Kamran Shahid
Kamran Shahid

Reputation: 4124

ItextSharp Html to pdf arabic characters are not combining in pdf

I am converting html to pdf using itextsharp Problem i am having is that any arabic sentence like يسعى برنامج الشيخ خليفة للتميز الحكومي إلى تحقيق when exported each characters in every word is becoming scrambled like http://easycaptures.com/6222949368

Check my code

protected void btnExporttoPdf_Click(object sender, EventArgs e)
{
    int assessorId = Convert.ToInt32(Session["assessorId"]);
    var ds = AssessorProvider.GetDataSetForTransformation(assessorId);

    using (var sw = new StringWriter())
    {
        var stringReader = new StringReader(ds.GetXml());
        XmlReader reader = XmlReader.Create(stringReader);
        var xpathDoc = new XPathDocument(reader);
        var transform = new XslCompiledTransform();
        transform.Load(Server.MapPath(Settings.AssessorFormTemplatePath));
        var argsList = new XsltArgumentList();
        argsList.AddParam("SiteRoot", "", Settings.DomainUrl);                
        transform.Transform(xpathDoc, argsList, sw);
        byte[] data;
        using (var sr = new StringReader(sw.ToString()))
        {
            var st = new StyleSheet();
            FontFactory.Register(Path.Combine(Server.MapPath("~/Common/Fonts/"), "ARIALUNI.TTF"));                  
            st.LoadTagStyle(HtmlTags.BODY, HtmlTags.FACE, "Arial Unicode MS");                  
            st.LoadTagStyle(HtmlTags.BODY, HtmlTags.ENCODING, BaseFont.IDENTITY_H);

            using (var ms = new MemoryStream())
            {
                using (var pdfDoc = new Document(PageSize.A4, 0.5f, 0.5f, 0.5f, 0.5f))
                {
                    using (var w = PdfWriter.GetInstance(pdfDoc, ms))
                    {
                        pdfDoc.Open();                               
                        var parsedHtmlElements = HTMLWorker.ParseToList(sr, st);
                        foreach (var htmlElement in parsedHtmlElements)
                        {
                            pdfDoc.Add(htmlElement as IElement);
                        }
                        pdfDoc.Close();
                        data = ms.ToArray();
                    }
                }
            }
        }
        Response.Buffer = false;
        Response.Clear();
        Response.ClearContent();
        Response.ClearHeaders();
        Response.ContentType = "application/pdf";
        Response.AddHeader("Content-Disposition", "attachment; filename=AssessorRegistration.pdf");
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.BinaryWrite(data); 
        Response.End();
    }
}

Edited:

I have tried with changes in above code as

 foreach (var htmlElement in parsedHtmlElements)
                                {
                                    if (htmlElement is PdfPTable)
                                    {
                                        SetDirection(htmlElement as PdfPTable);
                                    }
                                    pdfDoc.Add(htmlElement);
                                }

and my recursive method

private static void SetDirection(PdfPTable tbl)
        {
tbl.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
            foreach (PdfPRow pr in tbl.Rows)
            {
                foreach (PdfPCell pc in pr.GetCells())
                {
                    if (pc != null)
                    {
                        pc.RunDirection = PdfWriter.RUN_DIRECTION_RTL;

                        if (pc.CompositeElements != null)
                        {
                            foreach (var element in pc.CompositeElements)
                            {
                                if (element is PdfPTable)
                                {
                                    SetDirection((PdfPTable) element);
                                }
                            }
                        }
                    }
                }
            }
        }

Font's are concatenated but direction is not proper. Please check screenshots http://easycaptures.com/2213738973

Upvotes: 0

Views: 1834

Answers (1)

Kamran Shahid
Kamran Shahid

Reputation: 4124

Not a good solution but able to done via following

foreach (var htmlElement in parsedHtmlElements)
                                {
                                    if (htmlElement is PdfPTable)
                                    {
                                        SetDirection(htmlElement as PdfPTable);
                                    }
                                    pdfDoc.Add(htmlElement);
                                }



private static void SetDirection(PdfPTable tbl)
        {
            tbl.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
            tbl.HorizontalAlignment = Element.ALIGN_LEFT;
            foreach (PdfPRow pr in tbl.Rows)
            {
                foreach (PdfPCell pc in pr.GetCells())
                {
                    if (pc != null)
                    {
                        pc.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
                        pc.HorizontalAlignment = Element.ALIGN_LEFT;
                        if (pc.CompositeElements != null)
                        {
                            foreach (var element in pc.CompositeElements)
                            {
                                if (element is PdfPTable)
                                {
                                    SetDirection((PdfPTable)element);
                                }                               
                            }
                        }
                    }
                }
            }
        }

Also in my html change some cells order

Upvotes: 1

Related Questions