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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:06:10