如何使用iText7检测PDF中的FontAwesome图标并识别其类型与字重
基于iText7识别PDF中FontAwesome图标的解决方案
你遇到的字符显示乱码是系统、Excel缺失FontAwesome字体导致的渲染问题,PDF内部存储的字符编码、字体属性、字重参数都是完整可读取的,不需要依赖字符显示效果就能识别图标类型。
匹配规则
- 字符Unicode编码为
\uf14a,且所属字体族包含Font Awesome字段 → 判定为选中状态复选框 - 字符Unicode编码为
\uf111,所属字体族包含Font Awesome字段,且字体字重为900 → 判定为选中状态单选按钮
实现代码(PowerShell + iText7)
前置要求:先通过NuGet安装iText7核心包,替换代码中的dll路径为实际本地路径即可。
# 引用iText7核心程序集 Add-Type -Path "本地路径\itext.kernel.dll" Add-Type -Path "本地路径\itext.io.dll" # 自定义事件监听器,提取文本的完整属性 class FontAwesomeTextEventListener : iText.Kernel.Pdf.Canvas.Parser.Listener.IEventListener { $extractResult = [System.Collections.Generic.List[PSObject]]::new() [void] EventOccurred([iText.Kernel.Pdf.Canvas.Parser.Data.IEventData] $data, [iText.Kernel.Pdf.Canvas.Parser.EventType] $type) { if ($type -eq [iText.Kernel.Pdf.Canvas.Parser.EventType]::RENDER_TEXT) { $textRenderData = $data -as [iText.Kernel.Pdf.Canvas.Parser.Data.TextRenderInfo] $rawText = $textRenderData.GetText() $font = $textRenderData.GetFont() $fontFullName = $font.GetFontProgram().GetFontNames().GetFontName() $fontWeight = $font.GetFontProgram().GetFontMetrics().GetWeight() # 逐个字符提取编码 for ($i = 0; $i -lt $rawText.Length; $i++) { $charUnicode = [int]$rawText[$i] $this.extractResult.Add([PSCustomObject]@{ CharHexCode = '0x{0:X4}' -f $charUnicode FontName = $fontFullName FontWeight = $fontWeight }) } } } [System.Collections.Generic.IList[iText.Kernel.Pdf.Canvas.Parser.EventType]] GetSupportedEvents() { return [System.Collections.Generic.List[iText.Kernel.Pdf.Canvas.Parser.EventType]]@([iText.Kernel.Pdf.Canvas.Parser.EventType]::RENDER_TEXT) } } # 单份PDF处理示例 $targetPdfPath = "你的PDF文件路径\form.pdf" $pdfReader = [iText.Kernel.Pdf.PdfReader]::new($targetPdfPath) $pdfDoc = [iText.Kernel.Pdf.PdfDocument]::new($pdfReader) $eventListener = [FontAwesomeTextEventListener]::new() $canvasParser = [iText.Kernel.Pdf.Canvas.Parser.PdfCanvasProcessor]::new($eventListener, $false) # 遍历所有页面提取属性 for ($page = 1; $page -le $pdfDoc.GetNumberOfPages(); $page++) { $canvasParser.ProcessPageContent($pdfDoc.GetPage($page)) } $pdfDoc.Close() # 识别图标类型 foreach ($item in $eventListener.extractResult) { if ($item.FontName -match "Font.*Awesome") { switch ($item.CharHexCode) { "0xF14A" { # 匹配到选中复选框,可直接写入Excel对应字段 Write-Host "找到选中复选框" } "0xF111" { if ($item.FontWeight -eq 900) { # 匹配到选中单选按钮,可直接写入Excel对应字段 Write-Host "找到选中单选按钮" } } } } }
注意事项
- 不同HTML转PDF工具导出的FontAwesome字体名可能存在细微差异,比如带版本号的
FontAwesome5Pro,可根据实际提取到的FontName调整匹配规则。 - 不需要处理字符显示乱码问题,直接对比
CharHexCode的十六进制值即可完成识别,完全不影响判断准确性。 - 批量处理PDF只需在外层增加文件夹遍历逻辑,识别结果直接映射到Excel的对应列即可。
内容的提问来源于stack exchange,提问作者Erica Ackerman
相关产品推荐
相关产品推荐

