为此任务提供解决方案的完整代码将超出堆栈溢出答案的范围。因此,我将仅在此概述实现解决方案的一种方法。
障碍
这项任务比人们可能意识到的要困难。
特别是链接的文本不一定是使用几个显示操作的连续文本(更不用说单个)来绘制的。在最坏的情况下,链接的每个字母都可以在单独的指令中绘制,所有这些指令以随机顺序分布在整个内容流中,操作在其间绘制非链接内容。
因此,您无法单独查看每个内容流指令并立即决定如何处理它,这在您在问题中引用的先前方法中是可能的。相反,您必须收集所有文本和画线说明及其上下文,按页面顺序对其进行排序,在其中找到 URL 文本和附近的行,操作基础说明,然后写出页面内容。
此外,在参考答案中对“蓝色”的识别还不能捕捉到所有的蓝色;那里只考虑 RGB 颜色空间蓝色,但其他颜色空间也可能会产生蓝色调。此外,文本最初可能以不同的颜色绘制,并通过一些叠加层进行更改。此外,这些色彩空间不一定包含黑色调。因此,对于通用解决方案底层指令的操作比在识别的链接文本片段和行之前简单地更改颜色值更困难。
一种实现方法
仍然可以基于从this answer 借用的引用答案(this 和this)中使用的PdfCanvasEditor 构建考虑到这些障碍的解决方案。但是,与那里的解决方案相比,指令必须在 write 方法中收集,其中包含执行时状态的一些相关信息,特别是文本绘制指令的文本和文本位置以及行的行位置绘图说明和颜色。
iText LocationTextExtractionStrategy 已经这样做了,只是没有记住原始说明。因此,您可以从该策略中借用代码甚至集成它(而不是默认情况下在 PdfCanvasEditor 中使用的虚拟渲染侦听器),并且只需引用策略类处理的文本块中的相应指令。
当页面的所有指令与这些额外信息一起收集后,您必须对文本进行排序。 LocationTextExtractionStrategy 还包含对文本块进行相应排序的代码,您现在可以将其用于您的任务。
在这些排序的文本块中,您现在可以查找链接文本。找到它们后,您可以访问与这些块相关联的所有文本绘制指令以及位于这些块正下方的所有线条绘制指令,检查它们的颜色是否为蓝色,并且(如果是蓝色)将它们包裹在“更改为黑色”中和“再次变回以前的颜色”说明括号。
要识别创建蓝色文本的更狂野的方法,您必须进一步改进对说明的分析。例如。如果在混合模式下变亮稍后包含某些文本的区域被填充为蓝色,则原本黑白的文本突然变为白底蓝。
可能的概括
如果您以某种方式公开已排序的文本块并创建一个更灵活的界面,其中包含一些更改的方法以应用于底层指令,那么这种方法实际上会产生更通用的 PDF 文本操纵器。
由于上述方法无论如何都需要相当多的周时间才能实现可靠的实施,您可能需要考虑这样一种更通用的架构,以便以后重用和共享。