2013-07-19 2 views
0

Я успешно преобразовал строку rtf String в строку html, которая была необходима для отображения форматирования вместе с текстом. Хорошо, теперь я преобразовал этот html в pdf, используя Markuponverter libary - тот, который я нашел в codeproject. Когда я открываю pdf-файл, он отображает текст на английском с форматированием, но когда я пытаюсь преобразовать текст, написанный на арабском языке (или урду, являющийся его подмножеством), текст не сохраняется в pdf-файле после преобразования в pdf. Я считал, что это может быть проблема с отображением шрифтов, и попробовал изменить шрифты, такие как ARIALUNI.TTF, но ничего не произошло. Пока я пробовал это, и я собираюсь написать фрагмент, который я использую здесь, чтобы каждый мог указать на ошибки и предложить несколько советов.Арабский Текст не отображается при преобразовании из html в pdf с помощью iText #

RichTextBox rtbnew = new RichTextBox(); 
     rtbnew.Rtf = this.rtb.Rtf; 
     String abc = this.markupConverter.ConvertRtfToHtml(rtbnew.Rtf); 
     MessageBox.Show(abc); 
     //rtbnew.Text = this.rtb.Text; 
     //string str = rtbnew.Text; 
     //TextReader tr = new StringReader(str); 
     Document doc = new Document(); 
     PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(@path + "/Doc2.pdf", FileMode.Create)); 
     ////////////////// 
     doc.Open(); 

     //Sample HTML 
     StringBuilder stringBuilder = new StringBuilder(); 
     stringBuilder.Append(@"<?xml version=""1.0"" encoding=""UTF-8""?> 
      <!DOCTYPE html 
       PUBLIC ""-//W3C//DTD XHTML 1.0 Strict//EN"" 
       ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""> 
      <html xmlns=""http://www.w3.org/1999/xhtml"" xml:lang=""en"" lang=""en""> 
       <head> 
        <title>Minimal XHTML 1.0 Document with W3C DTD</title> 
       </head> 
       <body> 
" + abc + " </body></html>"); 

     //Path to our font 
     string arialuniTff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF"); 
     //Register the font with iTextSharp 
     iTextSharp.text.FontFactory.Register(arialuniTff); 

     //Create a new stylesheet 
     iTextSharp.text.html.simpleparser.StyleSheet ST = new iTextSharp.text.html.simpleparser.StyleSheet(); 
     //Set the default body font to our registered font's internal name 
     ST.LoadTagStyle(HtmlTags.BODY, HtmlTags.FACE, "Arial Unicode MS"); 
     //Set the default encoding to support Unicode characters 
     ST.LoadTagStyle(HtmlTags.BODY, HtmlTags.ENCODING, BaseFont.IDENTITY_H); 

     //Parse our HTML using the stylesheet created above 
     List<IElement> list = HTMLWorker.ParseToList(new StringReader(stringBuilder.ToString()), ST); 

     //Loop through each element, don't bother wrapping in P tags 
     foreach (var element in list) 
     { 
      MessageBox.Show(element.ToString()); 
      doc.Add(element); 
     } 

     doc.Close(); 

Этот код содержит текст на английском языке с форматом и без него, но не показывает арабский текст, даже не обычный текст.

+0

Используя довольно много ваш точный код и только заменив RTF часть с строкового литерала я был в состоянии получить PDF который выводит арабский текст. 'string abc =" میں اردو نہیں بولتے ";' Однако он выглядит обратным, когда отображается. Он работает для вас без части RTF? –

+0

Крис я пробовал 3 метода и ничего не придумал. Сначала я сделал: rtbnew.Text = this.rtb.Text; String abc = this.markupConverter.ConvertRtfToHtml (rtbnew.Rtf); и это снова дает мне текст, кроме вопросительных знаков, как ???? и второй, который я попробовал, был: rtbnew.Text = this.rtb.Text; String abc = this.markupConverter.ConvertRtfToHtml (rtbnew.Text); и это не дает ничего, кроме пустой страницы. –

+0

Теперь в третьем случае, когда я попробовал вашу простую замену простой строкой фразы Urdu, назначенной String abc, он дал мне текст Urdu в pdf-файле, но слова были разбиты на литералы, как на میں, это было م ے ن. Я не знаю, что, вероятно, я должен делать? Пожалуйста, помогите мне. –

ответ

0

Знаки вопроса вместо символов wkhtmltopdf не могут найти шрифт с арабскими буквами. Самый дурак доказательство решение, которое я нашел для этого является Base64-encode your font, и включить его непосредственно в объявлении CSS/стиль:

@font-face { 
    font-family: 'Amiri'; 
    src: url(data:font/truetype;charset=utf-8;base64,<BASE64-ENCODED-DATA> 
} 

EDIT: Шаг за шагом инструкции:

  1. Визит this site.
  2. Загрузите свой шрифт до Encode binary file, затем нажмите Encode. Это будет кодировать файл и генерировать закодированный шрифт. Результат будет похож на кучу случайных символов.
  3. Скопируйте фрагмент CSS выше и замените <BASE64-ENCODED-DATA> на выход Base64, полученный из кодировки.
  4. Добавьте этот фрагмент CSS в таблицу стилей, где-то рядом с вершиной. Важно добавить это, прежде чем ссылаться на шрифт ARIALUNI в коде CSS.
  5. Теперь вы можете объявить HTML элементы, чтобы использовать этот шрифт, как обычно:
@font-face { 
    font-family: 'ARIALUNI'; 
    src: url(data:font/truetype;charset=utf-8;base64,AAEAAAATAQA... 
} 
body, h1 { 
    font-family: 'ARIALUNI', sans-serif; 
} 
+0

Я вообще не знаком с этим, и не могли бы вы рассказать мне процедуру преобразования шрифта ARIALUNI.ttf в шрифт base64 и затем вставить его в файл style.css? –

+0

@ShahidSultanMinhas, я обновил ответ более подробно. –

+0

Нужно ли загружать файл ARIALUNI.ttf? Я имею в виду, что у меня есть это, как я могу преобразовать его в двоичный файл? –

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