使用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无法仅通过字体名定位到自定义字体文件,需要明确提供字体文件的路径或字节流。
修正步骤
- 准备字体文件:确保Rubik字体的相关文件(如
Rubik-Regular.ttf、Rubik-Bold.ttf)已添加到项目中,设置文件属性的复制到输出目录为"如果较新则复制"。 - 加载字体文件:使用
FontProvider.AddFont方法传入字体文件的路径(相对或绝对),而非仅字体名。 - 绑定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
相关产品推荐
相关产品推荐

