iTextSharp转换HTML到PDF时阿拉伯文本不显示问题求助
解决iTextSharp转换HTML到PDF时阿拉伯文本不显示的问题
核心问题分析
阿拉伯文本属于RTL(从右到左)语言,除了注册支持阿拉伯文的字体,还需要处理文本排版方向、确保字体编码正确,同时XMLWorker需要正确识别RTL文本的渲染规则。
具体解决方案
使用支持阿拉伯文的字体
避免使用普通Arial,改用支持完整阿拉伯文的字体,比如Arial Unicode MS、Arabic Typesetting,或者开源阿拉伯字体(如Amiri)。这些字体包含阿拉伯文的字形和连字规则。正确注册字体并指定编码
注册字体时必须指定BaseFont.IDENTITY_H编码,这是iTextSharp支持完整Unicode字符集的关键。强制RTL文本排版
在HTML中添加全局CSS样式,或者通过XMLWorker注入样式,设置文本方向为从右到左,确保阿拉伯文本正确排版。调整PdfWriter的文本方向配置
显式设置PdfWriter的运行方向为RTL,确保整个文档或段落的文本流向正确。
修改后的完整代码
private void CreatePDFItextSharp() { string dataFile = Server.MapPath("~/Html.txt"); // 读取HTML时指定UTF-8编码,避免中文/阿拉伯文乱码 string html = File.ReadAllText(dataFile, Encoding.UTF8); Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f); // 改用支持阿拉伯文的字体,比如Arial Unicode MS string arabicFontPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF"); // 注册字体到FontFactory FontFactory.Register(arabicFontPath, "ArabicFont"); XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); // 注册字体到XMLWorker的字体提供者,指定编码 fontProvider.Register(arabicFontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); byte[] bytes; using (MemoryStream memoryStream = new MemoryStream()) { PdfWriter writer = PdfWriter.GetInstance(pdfDoc, memoryStream); pdfDoc.Open(); // 设置文档默认文本方向为RTL writer.RunDirection = PdfWriter.RUN_DIRECTION_RTL; // 注入全局CSS,确保阿拉伯文本正确排版 string css = @" body { font-family: 'ArabicFont'; direction: rtl; unicode-bidi: embed; font-size: 12pt; } "; var xmlWorker = XMLWorkerHelper.GetInstance(); using (MemoryStream htmlContent = new MemoryStream(Encoding.UTF8.GetBytes(html))) using (MemoryStream cssContent = new MemoryStream(Encoding.UTF8.GetBytes(css))) { // 同时传入CSS和HTML内容 xmlWorker.ParseXHtml(writer, pdfDoc, htmlContent, cssContent, Encoding.UTF8, fontProvider); } pdfDoc.Close(); bytes = memoryStream.ToArray(); } Response.Clear(); Response.ContentType = "application/pdf"; Response.AddHeader("Content-Disposition", "attachment; filename=Invoice.pdf"); Response.Buffer = true; Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.BinaryWrite(bytes); Response.End(); }
关键修改点说明
- 字体选择与注册:使用
Arial Unicode MS(路径为ARIALUNI.TTF),注册时指定编码和嵌入字体,确保PDF在无对应字体的环境下也能显示阿拉伯文本。 - RTL方向设置:通过
writer.RunDirection = PdfWriter.RUN_DIRECTION_RTL设置文档全局文本方向,同时CSS中指定direction: rtl和unicode-bidi: embed,解决阿拉伯文的排版顺序问题。 - 编码一致性:读取HTML和转换流时统一使用UTF-8编码,避免字符编码错误。
内容的提问来源于stack exchange,提问作者Hasan
相关产品推荐
相关产品推荐

