Reputation: 4124
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
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