如何使用 iText7 检测 PDF 中的 fontawesome 图标

Posted

技术标签:

【中文标题】如何使用 iText7 检测 PDF 中的 fontawesome 图标【英文标题】:How to detect a fontawesome icon in a PDF using iText7 【发布时间】:2022-01-05 16:40:43 【问题描述】:

我有几千个 PDF,我正在使用 Powershell 和 iText7 处理,将 PDF 的文本导出到 Excel。 PDF 是从 html 生成的——它们不是来自可填写的表单。一些重要信息是通过“复选框”和“单选按钮”捕获的,它们实际上是 FontAwesome 图标(复选框为 \f14a,单选按钮的字体粗细为 900 的 \f111)。使用 CSS ::before 标记将图标添加到 HTML。它们在 PDF 中显示良好,但在我的输出中它们无法识别为字符(在 Powershell 控制台中,它们显示为小的空矩形,而在 Excel 中,它们显示为内部带有问号的小矩形)。

这是原始 HTML 中所选单选按钮的 CSS:

input[type=radio]:checked + label.ReplaceWithIcon:before 
    font-family: 'Font Awesome 5 Pro';
    content: "\f111";
    font-weight: 900;

这是原始 HTML 中复选框的 CSS:

input[type=checkbox]:checked + label.ReplaceWithIcon:before 
    font-family: 'Font Awesome 5 Pro';
    content: "\f14a";
    font-weight: 900;

有什么方法可以检测正在使用的图标吗?我不需要图标显示在输出中——我只需要知道检测到哪个图标。另外,对于单选按钮一,我需要知道字体粗细是什么。 (在原始 HTML 中以 font-weight: 900 表示选中。)

【问题讨论】:

您的两个值都来自 Unicode 私人使用范围: - (U+F111, 私人使用) 和 (U +F14A,私人使用)。您不能期望您的控制台/终端字体包含合适的字形。使用 standard Unicode,例如 (U+2713, 复选标记)。 当您覆盖现有的文本提取策略时,您是否获得可识别的字体名称?另外,那些 FontAwesome 图标 是唯一提取为私人使用区号点的字符吗?然后您可以在提取后应用简单的搜索和替换,然后再进行进一步处理... @mkl 我不太清楚你所说的覆盖现有文本提取策略是什么意思。对于您的第二个问题,这些图标可能是唯一的私人使用区域字符。 “我不太清楚你所说的覆盖现有文本提取策略是什么意思。” - 你的任务是导出 PDF 的文本,即文本提取。对于 iText 7 的文本提取,您使用文本提取策略(因为您没有显示代码,所以我无法显示您在哪里执行)。因此,您可以通过创建自己的文本提取策略来实现特殊的文本提取行为,可能是从现有策略派生而来。 “对于您的第二个问题,这些图标可能是唯一的私人使用区域字符。” - 那么您为什么不简单地搜索从 PDF 中获得的文本字符串对于 '\uf111' 和 '\uf14a' 并适当地处理它们? 【参考方案1】:

感谢@mkl 的评论,我通过匹配“\uf111”和“\uf14a”来实现这一点。

【讨论】:

以上是关于如何使用 iText7 检测 PDF 中的 fontawesome 图标的主要内容,如果未能解决你的问题,请参考以下文章

iText7 & C# 从存储在 MSSQL DB 中的 PDF 中提取页面

如何使用 itext7 Java 将多个图像添加到 PDF?

如何使用 iText 7 删除受密码保护的 pdf 中的密码

使用iText7操作PDF

使用 itext 7 在 PDF 中添加新页面

pdf格式在itext7中为空