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

C# 使用iText从html转换为pdf时不显示阿拉伯文文本#,c#,pdf,itextsharp,wkhtmltopdf,C#,Pdf,Itextsharp,Wkhtmltopdf,我已经成功地将rtf字符串转换为html字符串,这是显示文本格式的必要步骤。到现在为止,我已经使用Markuponverter库将这个html转换成pdf,这是我在codeproject中找到的。当我打开pdf文件时,它会显示带有格式的英文文本,但当我尝试转换以阿拉伯语编写的文本(或乌尔都语是其子集)时,转换为pdf后pdf文件中没有文本。我认为这可能是一个字体渲染问题,并尝试过像ARIALUNI.TTF那样更改字体,但什么也没发生。到目前为止,我已经试过了,我将在这里写一个片段,这样任何人都可

我已经成功地将rtf字符串转换为html字符串,这是显示文本格式的必要步骤。到现在为止,我已经使用Markuponverter库将这个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();
RichTextBox rtbnew=new RichTextBox();
rtbnew.Rtf=this.rtb.Rtf;
字符串abc=this.markupConverter.ConvertRtfToHtml(rtbnew.Rtf);
MessageBox.Show(abc);
//rtbnew.Text=this.rtb.Text;
//字符串str=rtbnew.Text;
//TextReader tr=新的StringReader(str);
单据单据=新单据();
PdfWriter writer=PdfWriter.GetInstance(doc,newfilestream(@path+“/Doc2.pdf”,FileMode.Create));
//////////////////
doc.Open();
//示例HTML
StringBuilder StringBuilder=新的StringBuilder();
stringBuilder.Append(@)
带有W3C DTD的最小XHTML 1.0文档
“+abc+”);
//我们字体的路径
字符串arialuniTff=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts),“ARIALUNI.TTF”);
//使用iTextSharp注册字体
iTextSharp.text.FontFactory.Register(arialuniTff);
//创建一个新的样式表
iTextSharp.text.html.simpleparser.StyleSheet ST=new iTextSharp.text.html.simpleparser.StyleSheet();
//将默认正文字体设置为注册字体的内部名称
ST.LoadTagStyle(HtmlTags.BODY,HtmlTags.FACE,“Arial Unicode MS”);
//将默认编码设置为支持Unicode字符
ST.LoadTagStyle(HtmlTags.BODY,HtmlTags.ENCODING,BaseFont.IDENTITY_H);
//使用上面创建的样式表解析我们的HTML
List List=HTMLWorker.parsetList(新的StringReader(stringBuilder.ToString()),ST);
//循环遍历每个元素,不用费心用P标记包装
foreach(列表中的var元素)
{
Show(element.ToString());
单据新增(要素);
}
doc.Close();

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

问号代替字符表示
wkhtmltopdf
找不到带阿拉伯文字符的字体。我找到的最简单的解决方案是,将其直接包含在CSS/样式声明中:

@font-face{
字体系列:“阿米里”;
src:url(数据:font/truetype;charset=utf-8;base64,
}
编辑:逐步说明:

  • 访问
  • 将字体上载到
    Encode binary file
    ,然后按
    Encode
    。这将对文件进行编码并生成编码字体。输出看起来像一堆随机字符
  • 复制上面的CSS片段,并用编码得到的Base64输出替换
  • 将此CSS片段添加到样式表顶部附近的某个位置。在CSS代码中引用
    ARIALUNI
    font之前添加此片段非常重要
  • 现在,您可以声明HTML元素以使用此字体,正如您通常所做的那样:
  • @font-face{
    字体系列:“阿里亚鲁尼”;
    src:url(数据:font/truetype;charset=utf-8;base64,AAEAAAATAQA。。。
    }
    身体,h1{
    字体系列:“ARIALUNI”,无衬线;
    }
    
    使用几乎完全相同的代码,仅用字符串文字替换RTF部分,我就能够得到一个输出阿拉伯语文本的PDF。
    string abc=“می¬و¬¬و¬¬
    但是,渲染时它确实看起来是向后的。没有RTF部分它对您有效吗?Chris我尝试了其中的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)第三种情况是,当我尝试用一个简单的乌尔都语字符串替换一个字符串abc时,它给了我一个pdf文件中的乌尔都语文本,但单词被分解成了文字,比如“می¬”,它是“مےن”。我不知道我可能该怎么办?请帮帮我。我对此不熟悉你能告诉我将ARIALUNI.ttf字体转换成base64字体,然后将其嵌入style.css文件的过程吗?我需要在那里上传ARIALUNI.ttf文件吗?我的意思是我有这个,因为我如何将其转换成二进制文件?我需要将上述代码片段放入style.css文件吗?编码数据放在哪里我的意思是,应该把它放在styles.css文件中吗?然后我需要引用像st.LoadTagStyle(“body”、“face”、“c:\\documents\\styles.css”)这样的css文件;是的,按照步骤2中的说明将它上载到站点。将我的示例中的
    替换为编码字体(您从网站获得的内容)。然后将整个
    @font-face
    CSS声明添加到你的
    样式.CSS
    文件中。我按照你说的做了,但徒劳无功。它显示的是英文文本,但不是乌尔都语文本,当我打开pdf文件属性时,它在字体选项卡中显示Helvetica。我不知道它为什么不选择样式表或什么?