VB.NET环境下使用iTextSharp转HTML为PDF时阿拉伯语无法显示
问题原因
- 手动定义的字体未注册到XML Worker的字体提供器,解析HTML内容时无法调用该字体渲染阿拉伯字符
- 未开启阿拉伯语所需的从右到左(RTL) 排版支持
- 原代码使用的
ParseXHtml重载未传入自定义字体配置,非英文字符无法匹配到可用字体
修正后的实现代码
Dim bf As BaseFont = BaseFont.CreateFont("c:\windows\fonts\arial.ttf", BaseFont.IDENTITY_H, True) ' 注册支持阿拉伯语的字体到XML Worker字体提供器 Dim fontProvider As New XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS) fontProvider.Register("c:\windows\fonts\arial.ttf", "Arial") Using sw As StringWriter = New StringWriter() Using hw As HtmlTextWriter = New HtmlTextWriter(sw) Me.Page.RenderControl(hw) Dim sr As StringReader = New StringReader(sw.ToString()) Dim pdfDoc As Document = New Document(PageSize.A4, 10.0F, 10.0F, 10.0F, 0.0F) Dim writer As PdfWriter = PdfWriter.GetInstance(pdfDoc, Response.OutputStream) ' 开启RTL排版支持适配阿拉伯语书写规则 writer.SetRunDirection(PdfWriter.RUN_DIRECTION_RTL) pdfDoc.Open() ' 传入自定义字体提供器、UTF8编码配置调用解析方法 XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr, Nothing, System.Text.Encoding.UTF8, fontProvider) pdfDoc.Close() Response.Cache.SetCacheability(HttpCacheability.NoCache) ' 补充PDF响应头配置 Response.ContentType = "application/pdf" Response.AddHeader("content-disposition", "attachment;filename=output.pdf") Response.BinaryWrite(pdfDoc) Response.End() End Using End Using
关键修改说明
- 显式创建
XMLWorkerFontProvider实例并注册阿拉伯语支持字体,确保XML Worker解析HTML时可匹配到对应字体渲染阿拉伯字符 - 开启PDF Writer的RTL排版配置,适配阿拉伯语从右到左的书写逻辑
- 调用带字体提供器、编码参数的
ParseXHtml重载,避免多字节字符编码异常 - 修正响应输出逻辑,补充PDF专属响应头,避免浏览器无法正确识别输出内容
注意事项
- 若HTML内容中显式指定了
font-family属性,需保证属性值和注册字体时传入的别名一致 - 若服务器环境不存在Arial字体,可替换为其他支持阿拉伯语的字体,如Noto Naskh Arabic、Amiri等
- 若存在阿英混排场景,可在HTML标签中通过
dir属性单独指定局部内容的排版方向
内容的提问来源于stack exchange,提问作者Ahmad Rumanneh
相关产品推荐
相关产品推荐

