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