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

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

关键修改点说明

  1. 字体选择与注册:使用Arial Unicode MS(路径为ARIALUNI.TTF),注册时指定编码和嵌入字体,确保PDF在无对应字体的环境下也能显示阿拉伯文本。
  2. RTL方向设置:通过writer.RunDirection = PdfWriter.RUN_DIRECTION_RTL设置文档全局文本方向,同时CSS中指定direction: rtl和unicode-bidi: embed,解决阿拉伯文的排版顺序问题。
  3. 编码一致性:读取HTML和转换流时统一使用UTF-8编码,避免字符编码错误。

内容的提问来源于stack exchange,提问作者Hasan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:25:18