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

使用iText设置Rubik字体报错:FontProvider无法解析字体家族名

解决iText使用自定义字体Rubik时的FontProvider报错问题

问题场景

生成PDF时使用自定义字体Rubik,代码如下:

using (MemoryStream ms = new MemoryStream())
{
     var pdfWriter = new iText.Kernel.Pdf.PdfWriter(ms);

     iText.Kernel.Pdf.PdfDocument pdf = new PdfDocument(pdfWriter);
     iText.Layout.Document doc = new Document(pdf);

     var com_prh = new iText.Layout.Element.Paragraph()
     .SetTextAlignment(iText.Layout.Properties.TextAlignment.CENTER)
     .SetHorizontalAlignment(iText.Layout.Properties.HorizontalAlignment.CENTER)
     .SetFontFamily("Rubik")
     .SetFontSize(18)
     .SetBold()
     .SetFontColor(ColorConstants.BLACK);
     doc.Add(com_prh);
     
     doc.Close();
}

报错信息

FontProvider and FontSet are empty. Cannot resolve font family name (see ElementPropertyContainer#setFontFamily) without initialized FontProvider (see RootElement#setFontProvider).

尝试过的代码

尝试通过FontProvider添加Rubik字体,但AddFont返回false:

FontProvider font = new FontProvider();

var defaultFontFamily = font.GetDefaultFontFamily(); // Helvetica

var addPdfFonts = font.AddStandardPdfFonts();

var addFont = font.AddFont("Rubik"); // false

其中AddStandardPdfFonts实现如下:

public virtual int AddStandardPdfFonts()
{
    AddFont("Courier");
    AddFont("Courier-Bold");
    AddFont("Courier-BoldOblique");
    AddFont("Courier-Oblique");
    AddFont("Helvetica");
    AddFont("Helvetica-Bold");
    AddFont("Helvetica-BoldOblique");
    AddFont("Helvetica-Oblique");
    AddFont("Symbol");
    AddFont("Times-Roman");
    AddFont("Times-Bold");
    AddFont("Times-BoldItalic");
    AddFont("Times-Italic");
    AddFont("ZapfDingbats");

    return 14;
}

解决方案

问题原因

直接传入字体名"Rubik"调用AddFont失败,是因为iText无法仅通过字体名定位到自定义字体文件,需要明确提供字体文件的路径或字节流。

修正步骤

  1. 准备字体文件:确保Rubik字体的相关文件(如Rubik-Regular.ttf、Rubik-Bold.ttf)已添加到项目中,设置文件属性的复制到输出目录为"如果较新则复制"。
  2. 加载字体文件:使用FontProvider.AddFont方法传入字体文件的路径(相对或绝对),而非仅字体名。
  3. 绑定FontProvider到文档:通过Document.SetFontProvider将配置好的字体提供者关联到文档。

修正后完整代码

using (MemoryStream ms = new MemoryStream())
{
    var pdfWriter = new iText.Kernel.Pdf.PdfWriter(ms);
    iText.Kernel.Pdf.PdfDocument pdf = new PdfDocument(pdfWriter);
    
    // 初始化FontProvider并添加标准字体作为 fallback
    FontProvider fontProvider = new FontProvider();
    fontProvider.AddStandardPdfFonts();
    
    // 加载Rubik常规和粗体字体(路径根据实际项目结构调整)
    bool isRegularAdded = fontProvider.AddFont(@"Fonts/Rubik-Regular.ttf");
    bool isBoldAdded = fontProvider.AddFont(@"Fonts/Rubik-Bold.ttf");
    
    // 将FontProvider绑定到Document
    iText.Layout.Document doc = new Document(pdf);
    doc.SetFontProvider(fontProvider);
    
    var com_prh = new iText.Layout.Element.Paragraph("需要显示的文本内容")
        .SetTextAlignment(iText.Layout.Properties.TextAlignment.CENTER)
        .SetHorizontalAlignment(iText.Layout.Properties.HorizontalAlignment.CENTER)
        .SetFontFamily("Rubik")
        .SetFontSize(18)
        .SetBold()
        .SetFontColor(ColorConstants.BLACK);
    doc.Add(com_prh);
    
    doc.Close();
}

关键点说明

  • 必须加载对应字重的字体文件:比如使用SetBold时,需要确保Rubik-Bold.ttf已被加载,否则iText会自动 fallback 到其他可用字体。
  • 字体路径需准确:如果字体文件放在项目根目录下的Fonts文件夹,相对路径即为@"Fonts/Rubik-Regular.ttf";如果是绝对路径,直接传入完整路径即可。
  • 绑定FontProvider是必要步骤:只有将配置好的FontProvider设置到Document,文本元素才能正确解析并使用自定义字体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:18:28