You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:24:04