首页 > 解决方案 > 遍历整个PDF并将蓝色更改为黑色并删除下划线(但仅限于包含“http//”和“https//”的文本)+ iText

问题描述

我想将文本的颜色从蓝色更改为黑色,并且还想删除下划线。但仅来自那些包含“http//”和“https//”的文本

参考链接:

遍历整个PDF并将蓝色更改为黑色(也更改下划线的颜色)+ iText

仅遍历整个 PDF 并删除超链接(注释)的下划线 + iText

标签: pdfitext

解决方案


提供此任务解决方案的完整代码将超出堆栈溢出答案的范围。因此,我将在这里仅概述一种实现解决方案的方法。

障碍

这项任务比人们可能意识到的要困难得多。

特别是链接的文本不一定是使用几个显示操作的连续文本(更不用说单个)来绘制的。在最坏的情况下,链接的每个字母都可以在单独的指令中绘制,所有这些指令以随机顺序分布在整个内容流中,操作在其间绘制非链接内容。

因此,您不能像在问题中引用的先前方法中那样,单独查看每个内容流指令并立即决定如何处理它。相反,您必须收集所有文本和画线说明及其上下文,按页面顺序对其进行排序,在其中找到 URL 文本和附近的行,操作基础说明,然后写出页面内容。

此外,在参考答案中对“蓝色”的识别还不能捕捉到所有的蓝色;那里只考虑 RGB 颜色空间蓝色,但其他颜色空间也可能会产生蓝色调。此外,文本最初可能以不同的颜色绘制,并通过一些叠加层进行更改。此外,这些色彩空间不一定包含黑色调。因此,对于通用解决方案的底层指令的操作比在识别的链接文本片段和行之前简单地更改颜色值更困难。

一种实现方法

考虑到这些障碍的解决方案仍然可以基于从该答案借用PdfCanvasEditor的参考答案(thisthis )中使用的内容来构建。然而,与那里的解决方案相比,指令必须收集在方法中,其中包含执行时状态的一些相关信息,特别是文本绘制指令的文本和文本位置以及线条绘制指令的线条位置,和颜色。write

iTextLocationTextExtractionStrategy已经这样做了,只是没有记住原始说明。因此,您可以从该策略中借用代码甚至集成它(而不是默认情况下使用的虚拟渲染侦听器PdfCanvasEditor),并且只需从策略类处理的文本块中引用相应的指令。

当页面的所有指令与这些额外信息一起收集后,您必须对文本进行排序。还包含用于对文本块进行相应排序的LocationTextExtractionStrategy代码,您现在可以将其用于您的任务。

在这些排序的文本块中,您现在可以查找链接文本。找到它们后,您可以访问与这些块相关联的所有文本绘制指令以及位于这些块正下方的所有线条绘制指令,检查它们的颜色是否为蓝色,并且(如果是蓝色)将它们包裹在“更改为黑色”中和“再次变回以前的颜色”说明括号。

要识别更疯狂的方式来创建蓝色文本,您必须进一步改进对说明的分析。例如,如果在混合模式下,稍后将包含某些文本的区域填充为蓝色,则原本黑白的文本突然变成白底蓝。

可能的概括

如果您以某种方式公开已排序的文本块并创建一个更灵活的界面,其中包含用于将许多更改应用于底层指令的方法,那么这种方法实际上会产生更通用的 PDF 文本操纵器。

由于上述方法无论如何都需要相当多的周时间才能实现可靠的实现,您可能需要考虑这样一种更通用的架构,以便以后重用和共享。


推荐阅读