Click here to Skip to main content
15,881,810 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hello,

I havecreated PDF document from html string. but the arabic is not showing in the pdf can any one help me to solve this.

XML
DataTable dt = new DataTable();
            dt.Columns.AddRange(new DataColumn[3] {
		                    new DataColumn("OrderId"),
		                    new DataColumn("Product"),
		                    new DataColumn("Quanity")});
            dt.Rows.Add(101, "فيشنو", 5);
            dt.Rows.Add(102, "Jeans", 2);
            dt.Rows.Add(103, "Trousers", 12);
            dt.Rows.Add(104, "Shirts", 9);
            SendPDFEmail(dt);

private void SendPDFEmail(DataTable dt)
  {
      using (StringWriter sw = new StringWriter())
      {
          using (HtmlTextWriter hw = new HtmlTextWriter(sw))
          {
              string companyName = "ASPSnippets";
              int orderNo = 2303;
              StringBuilder sb = new StringBuilder();
              sb.Append("<table width='100%' cellspacing='0' cellpadding='2'>");
              sb.Append("<tr><td align='center' style='background-color: #18B5F0' colspan = '2'><b>Order Sheet</b></td></tr>");
              sb.Append("<tr><td colspan = '2'></td></tr>");
              sb.Append("<tr><td><b>Order No:</b>");
              sb.Append(orderNo);
              sb.Append("</td><td><b>Date: </b>");
              sb.Append(DateTime.Now);
              sb.Append(" </td></tr>");
              sb.Append("<tr><td colspan = '2'><b>Company Name :</b> ");
              sb.Append(companyName);
              sb.Append("</td></tr>");
              sb.Append("</table>");
              sb.Append("<br />");
              sb.Append("<table border = '1'>");
              sb.Append("<tr>");
              foreach (DataColumn column in dt.Columns)
              {
                  sb.Append("<th style = 'background-color: #D20B0C;color:#ffffff'>");
                  sb.Append(column.ColumnName);
                  sb.Append("</th>");
              }
              sb.Append("</tr>");
              foreach (DataRow row in dt.Rows)
              {
                  sb.Append("<tr>");
                  foreach (DataColumn column in dt.Columns)
                  {
                      sb.Append("<td>");
                      sb.Append(row[column]);
                      sb.Append("</td>");
                  }
                  sb.Append("</tr>");
              }
              sb.Append("</table>");
              StringReader sr = new StringReader(sb.ToString());

              Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
              HTMLWorker htmlparser = new HTMLWorker(pdfDoc);


              using (MemoryStream memoryStream = new MemoryStream())
              {
                  PdfWriter writer = PdfWriter.GetInstance(pdfDoc, memoryStream);
                  pdfDoc.Open();

                  var arialFontPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF");
                  FontFactory.Register(arialFontPath);
                  BaseFont bf = BaseFont.CreateFont(arialFontPath, BaseFont.IDENTITY_H, true);
                  iTextSharp.text.Font FontAr = new iTextSharp.text.Font(bf);
                  iTextSharp.text.FontFactory.RegisterDirectory(arialFontPath);

                  StyleSheet styles = new StyleSheet();
                  styles.LoadTagStyle("body", "face", "Arial Unicode MS");

                  var htmlarraylist = HTMLWorker.ParseToList(sr, styles).ToArray();
                  for (int k = 0; k < htmlarraylist.Count(); k++)
                  {
                      pdfDoc.Add((IElement)htmlarraylist[k]);
                  }

                  htmlparser.Parse(sr);
                  pdfDoc.Close();
                  byte[] bytes = memoryStream.ToArray();
                  memoryStream.Close();

                  System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
                  mail.To.Add("zzzz@gmail.com");
                  mail.From = new MailAddress("xyxyx@gmail.com", "PDF", System.Text.Encoding.UTF8);
                  mail.Subject = "iTextSharp PDF";
                  mail.Body = "iTextSharp PDF Attachment";
                  mail.BodyEncoding = System.Text.Encoding.UTF8;
                  mail.Attachments.Add(new Attachment(new MemoryStream(bytes), "iTextSharpPDF.pdf"));
                  mail.IsBodyHtml = true;
                  mail.Priority = MailPriority.High;
                  SmtpClient client = new SmtpClient();
                  client.Credentials = new System.Net.NetworkCredential("xxxx@gmail.com", "xxxx123");
                  client.Port = 587;
                  client.Host = "smtp.gmail.com";
                  client.EnableSsl = true;
                  try
                  {
                      Thread threadmail = new Thread(delegate()
                      {
                          client.Send(mail);
                      });

                      threadmail.IsBackground = true;
                      threadmail.Start();
                  }
                  catch (Exception ex)
                  {
                      Exception ex2 = ex;
                      string errorMessage = string.Empty;
                      while (ex2 != null)
                      {
                          errorMessage += ex2.ToString();
                          ex2 = ex2.InnerException;
                      }

                  }



              }
          }
      }
  }
Posted
Updated 7-Oct-15 0:17am
v2

1 solution

Try setting the encoding as well as the font face:
C#
StyleSheet styles = new StyleSheet();
styles.LoadTagStyle("body", "face", "Arial Unicode MS");
styles.LoadTagStyle("body", "encoding", BaseFont.IDENTITY_H);

Also, the ParseToList method returns a List<IElement>; there's no need to convert it to an array:
C#
var elements = HTMLWorker.ParseToList(sr, styles);
foreach (IElement element in elements)
{
    pdfDoc.Add(element);
}

I suspect you don't need the htmlparser.Parse(sr); line, since you've already parsed the content with the ParseToList call.
 
Share this answer
 
Comments
Member 11460931 8-Oct-15 6:21am    
The arabic is working fine now but the arabic words are not in running letter how can i solve this?i check few font but no use please help me once again thanks
Richard Deeming 8-Oct-15 7:56am    
Sorry, I don't understand what you mean by "in running letter"?

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900