【问题标题】:Traverse whole PDF and change blue color to black and remove underlines as well ( But only from text which contains "http//" & "https//" ) + iText遍历整个PDF并将蓝色更改为黑色并删除下划线(但仅限于包含“http//”和“https//”的文本)+ iText
【发布时间】:2019-09-25 14:46:26
【问题描述】:

我想将文本的颜色从蓝色更改为黑色,并且还想删除下划线。但仅来自那些包含“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

【问题讨论】:

  • 这是对前面问题的重要扩展。我对您之前问题的回答基本上是我很乐意提供的PdfCanvasEditor 类的简单使用示例(
  • @mkl 感谢您的支持。我知道这是一个新问题。但我想要这个,如果有人可以帮助我。
  • @mkl 你调查过吗?
  • 如上所述,我可以描述我将如何处理该任务,但您必须进行实际实施,因为这超出了这里的答案范围。这会有帮助吗?
  • 感谢您的帮助@mkl。但我需要这个解决方案,如果有人帮忙的话。谢谢。

标签: pdf itext


【解决方案1】:

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

障碍

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

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

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

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

一种实现方法

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

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

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

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

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

可能的概括

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

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

【讨论】:

  • 对,但我没有足够的时间来写这个长长的解决方案,我只想要最快的解决方案,如果它不适用于所有 pdf,我可以生存,但它应该适用于大多数.但无论如何,非常感谢你@mkl。你是个乐于助人的人。
  • 恐怕你得花点时间了。您可能不需要检查创建蓝色的更狂野的方法,但您必须收集指令、分析它们、可能对相关的文本块进行排序、搜索链接文本、找到相关的指令、操作它们并编写指示回来。对于 iText 或 PDFBox,您必须自己实现所有这些。其他库可能已经包含了帮助类,但您必须先测试这些帮助类:在一种情况下,我尝试使用此类包含的帮助类,但对于现实世界的 PDF,它们完全失败了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 2011-02-16
相关资源
最近更新 更多