Отображение символов Юникода при преобразовании Html в Pdf

Я использую dll itextsharp для преобразования HTML в PDF.

HTML имеет некоторые символы Юникода, такие как α, β... когда я пытаюсь преобразовать HTML в PDF, символы Unicode не отображаются в PDF.

функции:

Document doc = new Document(PageSize.LETTER);

using (FileStream fs = new FileStream(Path.Combine("Test.pdf"), FileMode.Create, FileAccess.Write, FileShare.Read))
{
    PdfWriter.GetInstance(doc, fs);

    doc.Open();
    doc.NewPage();

    string arialuniTff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts),
                                      "ARIALUNI.TTF");

    BaseFont bf = BaseFont.CreateFont(arialuniTff, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

    Font fontNormal = new Font(bf, 12, Font.NORMAL);

    List<IElement> list = HTMLWorker.ParseToList(new StringReader(stringBuilder.ToString()),
                                                 new StyleSheet());
    Paragraph p = new Paragraph {Font = fontNormal};

    foreach (var element in list)
    {
        p.Add(element);
        doc.Add(p);
    }

    doc.Close();
}

4 ответов


при работе с символами Юникода и iTextSharp есть несколько вещей, о которых вам нужно позаботиться. Первый, который вы уже сделали, и который получает шрифт, который поддерживает ваших персонажей. Во-вторых, вы хотите фактически зарегистрировать шрифт с помощью iTextSharp, чтобы он знал об этом.

//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);

теперь, когда у нас есть шрифт, нам нужно создать StyleSheet объект, который сообщает iTextSharp, когда и как его использовать.

//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");

одна не-HTML часть, которая вам также нужно сделать это установить специальный


вы также можете использовать новый тег XMLWorkerHelper (из библиотеки itextsharp.xmlworker), однако вам необходимо переопределить реализацию FontFactory по умолчанию.

void GeneratePdfFromHtml()
{
  const string outputFilename = @".\Files\report.pdf";
  const string inputFilename = @".\Files\report.html";

  using (var input = new FileStream(inputFilename, FileMode.Open))
  using (var output = new FileStream(outputFilename, FileMode.Create))
  {
    CreatePdf(input, output);
  }
}

void CreatePdf(Stream htmlInput, Stream pdfOutput)
{
  using (var document = new Document(PageSize.A4, 30, 30, 30, 30))
  {
    var writer = PdfWriter.GetInstance(document, pdfOutput);
    var worker = XMLWorkerHelper.GetInstance();

    document.Open();
    worker.ParseXHtml(writer, document, htmlInput, null, Encoding.UTF8, new UnicodeFontFactory());

    document.Close();
  }    
}

public class UnicodeFontFactory : FontFactoryImp
{
    private static readonly string FontPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts),
      "arialuni.ttf");

    private readonly BaseFont _baseFont;

    public UnicodeFontFactory()
    {
      _baseFont = BaseFont.CreateFont(FontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

    }

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

private class UnicodeFontFactory : FontFactoryImp
{
    private BaseFont _baseFont;

    public  UnicodeFontFactory()
    {
        string FontPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "arialuni.ttf");
        _baseFont = BaseFont.CreateFont(FontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);                
    }

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

//и код

FontFactory.FontImp = new UnicodeFontFactory();

string convertedHtml = string.Empty;
foreach (char c in htmlText)
{
     if (c < 127)  
           convertedHtml += c;
     else
           convertedHtml += "&#" + (int)c + ";";
}

List<IElement> htmlElements = XMLWorkerHelper.ParseToElementList(convertedHtml, null);

// add the IElements to the document
foreach (IElement htmlElement in htmlElements)
{                            
      document.Add(htmlElement);
}

вот несколько шагов для отображения символов Юникода при преобразовании Html в Pdf

  1. создать HTMLWorker
  2. зарегистрируйте шрифт unicode и назначьте его
  3. создайте таблицу стилей и установите кодировку Identity-H
  4. назначьте таблицу стилей синтаксическому анализатору html

Проверьте ниже ссылку для более глубокого понимания....

хинди, турецкий, и специальные символы также отображаются во время преобразования из HTML в PDF с помощью этого метода. Проверьте ниже демонстрационное изображение.

enter image description here