2015-01-19 2 views
-1

Я использую следующий код для преобразования html в pdf. Но арабский язык не отображается при создании PDF. В чем проблема с следующим кодом.Арабский не отображается при преобразовании html в pdf в itext sharp asp.net C#

//Create a byte array that will eventually hold our final PDF 
Byte[] bytes; 


using (var ms = new MemoryStream()) 
{ 
    FontFactory.Register(Server.MapPath("~/fonts/TRADBDO.TTF")); 
    using (var doc = new Document()) 
    { 
     using (var writer = PdfWriter.GetInstance(doc, ms)) 
     {    
      doc.Open(); 

      var example_html = @"<p>This <em>is البرامج الدراسية المطروحة البرامج الدراسية المطروحةالبرامج الدراسية المطروحةالبرامج الدراسية المطروحةالبرامج الدراسية المطروحةالبرامج الدراسية المطروحة</em>55555<span class=""headline"" style=""text-decoration: underline;"">some</span> <strong>sample <em> text</em></strong><span style=""color: red;"">!!!</span></p>"; 
      var example_css = @".headline{font-size:200%}"; 

      FontFactory.Register(Server.MapPath("~/fonts/TRADBDO.TTF")); 
      using (var msCss = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(example_css))) 
      { 
       using (var msHtml = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(example_html))) 
       { 
        iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, msHtml, msCss); 
       } 
      } 
      doc.Close(); 
     } 
    }  
    bytes = ms.ToArray(); 
} 

var testFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test_123_345.pdf"); 
System.IO.File.WriteAllBytes(testFile, bytes); 
+0

Возможный дубликат [RTL не работает в формате pdf с текстом 5.5 для арабского текста] (http://stackoverflow.com/questions/23889488/rtl-not-working-in-pdf-generation-with-itext-5 -5-для-арабского текста). Пример представлен на Java, но тривиально изменить его на C#. –

+1

* Я не использую itextsharp * - почему вы так пометили его? И почему вы используете классы iTextSharp? – mkl

+0

почему вы отрицательный я использую ITEXT SHARP.Sorry Я ошибочно пишу «не» с моим предложением в комментарии –

ответ

0

ParseXHtml() принимает параметр, который позволяет вручную обрабатывать шрифты, которые, вероятно, проще всего сделать. Если вы подклассифицируете FontFactoryImp, вы можете переопределить метод GetFont и указать свой собственный шрифт. Следующий код делает это без большой логики и в значительной степени говорит: «Мне все равно, какой шрифт был указан в HTML, всегда используйте этот», который, вероятно, должен работать для вас.

public class FontOverrider : FontFactoryImp { 
    private readonly BaseFont baseFont; 

    /// <summary> 
    /// Create a new font factory that always uses the provided font. 
    /// </summary> 
    /// <param name="fullPathToFontFileToUse">The full path to the font file to use.</param> 
    /// <param name="encoding">The type of encoding to use. Default BaseFont.IDENTITY_H. See <see cref="http://api.itextpdf.com/itext/com/itextpdf/text/pdf/BaseFont.html#createFont(java.lang.String, java.lang.String, boolean)"/> for details.</param> 
    /// <param name="embedded">Whether or not to embed the entire font. Default True. See <see cref="http://api.itextpdf.com/itext/com/itextpdf/text/pdf/BaseFont.html#createFont(java.lang.String, java.lang.String, boolean)"/> for details.</param> 
    public FontOverrider(string fullPathToFontFileToUse, string encoding = BaseFont.IDENTITY_H, bool embedded = BaseFont.EMBEDDED) { 
     //If you are using this class then this font is required and a missing font should be a fatal error 
     if (!System.IO.File.Exists(fullPathToFontFileToUse)) { 
      throw new System.IO.FileNotFoundException("Could not find the supplied font file", fullPathToFontFileToUse); 
     } 

     //Create our embedded base font 
     baseFont = BaseFont.CreateFont(fullPathToFontFileToUse, encoding, embedded); 

    } 

    public override iTextSharp.text.Font GetFont(string fontname, string encoding, bool embedded, float size, int style, BaseColor color, bool cached) { 
     return new iTextSharp.text.Font(baseFont, size, style, color); 
    } 
} 

Для этого вам просто нужно изменить ParseXHtml() вызов этому:

iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, msHtml, msCss, System.Text.Encoding.UTF8, new FontOverrider(myFont)); 

где myFont это ваш Server.MapPath() (или любой другой) для вашего полного шрифта.

Просто заметьте, я посмотрел онлайн шрифт, который вы упомянули, и бесплатная версия, которую я нашел, не может быть юридически встроена в PDF. Если я попытаюсь использовать его, я действительно получаю сообщение, в котором я говорю именно это. Этот код предполагает, что вы позаботились о лицензионных соглашениях и имеете лицензионный шрифт для встраивания. Для моих целей образца я просто использовал Arial Unicode MS.

Смежные вопросы