遍历整个PDF并将蓝色更改为黑色并删除下划线(但仅限于包含"http//"和"https//"的文本)+ iText



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

的文本参考链接:

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

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

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

障碍

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

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

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

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

实施方法

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

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

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

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

为了识别创建蓝色文本的更野生方法,您必须进一步改进对指令的分析。 例如,如果在混合模式下,稍后将包含某些文本的区域填充为蓝色,则原本黑白文本突然变为白底蓝字。

可能的概括

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

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

最新更新