从iTextSharp迁移至iText7:如何获取PDF文本的字体粗细?
从iTextSharp迁移到iText7:获取字体粗细的正确姿势
我懂你在迁移时遇到的痛点——原来用iTextSharp时靠反射扒私有字段的写法虽然能用,但既不优雅还容易因为内部实现变化出问题。好在iText7的API设计更规范,直接提供了公开方法来获取字体权重,完全不需要绕反射的路子。
先说说原来的问题
你之前的iTextSharp代码通过反射访问fontWeight私有字段,这种写法依赖于库的内部实现细节,一旦库版本更新可能就失效了。而iText7把字体属性都封装成了公开的API,我们可以直接调用。
iText7的解决方案
在iText7中,TextRenderInfo.GetFont()返回的是PdfFont对象,我们可以通过它拿到FontProgram,然后调用GetFontWeight()方法直接获取字体权重值。下面是修改后的代码:
public class MyLocationTextExtractionStrategy : LocationTextExtractionStrategy { public override void RenderText(TextRenderInfo renderInfo) { // 一定要调用基类的RenderText方法,否则文本提取逻辑会不完整 base.RenderText(renderInfo); PdfFont pdfFont = renderInfo.GetFont(); if (pdfFont == null) return; FontProgram fontProgram = pdfFont.GetFontProgram(); int fontWeight = fontProgram.GetFontWeight(); // 这里可以根据需要使用fontWeight值,比如记录日志或做业务判断 // 常见权重参考:400=常规,700=粗体,取值范围100-900(步长100) // Console.WriteLine($"当前文本字体权重:{fontWeight}"); } }
补充说明
fontWeight的取值符合CSS字体权重标准,从100(极细)到900(极粗),步长为100,其中400是默认常规字重,700是标准粗体。- 如果遇到Type0复合字体,
GetFontWeight()也会正确返回对应的有效权重,不需要额外处理。 - 相比于反射写法,这种方式依赖公开API,兼容性和稳定性更强,后续iText7版本更新也不会轻易失效。
内容的提问来源于stack exchange,提问作者Sau001
相关产品推荐
相关产品推荐

