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

问题描述 投票:0回答:1

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

的文本

参考链接:

Traverse whole PDF and change blue color to black ( Change color of underlines as well) + iText

Traverse whole PDF and Remove underlines of hyperlinks (annotations) only + iText

pdf itext
1个回答
0
投票

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

障碍

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

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

因此,您不能单独查看每个内容流指令,也不能像在问题中引用的先前方法那样,立即决定如何处理它。取而代之的是,您必须收集所有带有其上下文的文本和线条绘图指令,以页面顺序对其进行排序,在其中查找URL文本和附近的线条,操纵基础指令,然后写出页面内容。

此外,在引用的答案中对“蓝色”的识别还不能涵盖所有的蓝色阴影;此处仅考虑RGB色彩空间蓝色,但其他色彩空间也可能会产生蓝色。同样,文本最初可能会以不同的颜色绘制,并通过一些叠加进行更改。此外,这些色彩空间不必一定包含黑色。因此,与仅在识别的链接文本段和行之前更改颜色值相比,用于一般解决方案的底层指令的操作更加困难。

一种实现方法

考虑到这些障碍的解决方案仍然可以基于从PdfCanvasEditor借来的参考答案(PdfCanvasEditorthis)中使用的this来构建。但是,与那里的解决方案相比,必须在this answer方法中收集指令,并在执行时收集一些有关状态的相关信息,尤其是文本绘制指令的文本和文本位置以及行的行位置绘图说明和颜色。

iText write已经做到了,只是没有保留原始说明

。因此,您可以从该策略中借用代码,甚至可以集成它(而不是LocationTextExtractionStrategy中默认使用的虚拟渲染侦听器),而只需要从策略类处理的文本块中引用相应的指令即可。

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

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

也要认识到创建蓝色文本的更疯狂的方法,您必须进一步改进对说明的分析。例如。如果以后在混合模式变亮

中用蓝色填充包含一些文本的区域,则原本为黑白的文本突然变为蓝白。

可能的概括

如果您以某种方式公开排序后的文本块并创建具有更灵活接口的方法,则该方法实际上将产生一个更通用的PDF文本操纵器,该方法具有将许多更改应用于基础指令的方法。

无论采用哪种方法,对于一个可靠的实现,都将花费数周的时间,您可能需要考虑使用这种更通用的体系结构,以便以后进行重用和共享。

© www.soinside.com 2019 - 2024. All rights reserved.