使用iText#从html转换为pdf时,不会显示阿拉伯语文本

本文关键字:显示 文本 阿拉伯语 pdf iText# html 转换 使用 | 更新日期: 2023-09-27 18:23:51

我已经成功地将rtf字符串转换为html字符串,这是显示文本格式的必要步骤。到目前为止,我已经使用Markuponverter libary将这个html转换为pdf,这是我在codeproject中找到的。当我打开pdf文件时,它会显示带格式的英文文本,但当我尝试转换用阿拉伯语(或乌尔都语是其子集)编写的文本时,在转换为pdf后,pdf文件中没有文本。我认为这可能是一个字体渲染问题,并尝试过更改ARIALUNI.TTF之类的字体,但什么也没发生。到目前为止,我已经尝试过了,我将在这里写一个我正在使用的片段,这样任何人都可以指出错误并提出一些建议。

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

此代码显示带和不带格式的英语文本,但不显示阿拉伯语文本,甚至不显示纯文本。

使用iText#从html转换为pdf时,不会显示阿拉伯语文本

问号而不是字符表示wkhtmltopdf找不到包含阿拉伯字符的字体。我发现的最愚蠢的解决方案是对你的字体进行Base64编码,并将其直接包含在CSS/style声明中:

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

编辑:分步说明:

  1. 访问此网站
  2. 将字体上载到Encode binary file,然后按Encode。这将对文件进行编码并生成编码后的字体。输出将看起来像一堆随机字符
  3. 复制上面的CSS片段,并将<BASE64-ENCODED-DATA>替换为从编码中获得的Base64输出
  4. 将这个CSS片段添加到样式表的顶部附近。在CSS代码中引用ARIALUNI字体之前,添加此内容非常重要
  5. 现在,您可以声明HTML元素使用这种字体,就像您通常会做的那样:
@font-face {
    font-family: 'ARIALUNI';
    src: url(data:font/truetype;charset=utf-8;base64,AAEAAAATAQA...
}
body, h1 {
    font-family: 'ARIALUNI', sans-serif;
}