PDFBox 2.0:在TextStripper中获取颜色信息

时间:2018-06-28 12:07:29

标签: java pdf pdfbox

我正在使用PDFBox PDFTextStripper进行文本提取。我还需要获取每个字符的颜色信息,最好是使用 writeString 方法。 我发现的是this用于PDFBox 1.8的解决方案(实际上可以很容易地转换为2.0版本),而我正在寻找的是每个字符的背景色(因为答案只有字符色) 。 我为 Fill 运算符添加了所有处理程序-CloseFillNonZeroAndStrokePath,CloseFillEvenOddAndStrokePath FillNonZeroAndStrokePath,FillEvenOddAndStrokePath,LegacyFillNonZeroRule,FillNonZeroRule,FillEvenOddRule(像在{{3king}

public final class FillEvenOddRule extends OperatorProcessor {
        @Override
        public void process(Operator operator, List<COSBase> operands) throws IOException {
            linePath.setWindingRule(GeneralPath.WIND_EVEN_ODD);
            deleteCharsInPath();
            linePath.reset();
            PDGraphicsState gs = getGraphicsState();    
            PDColor nonStrokingColor = gs.getNonStrokingColor();
            fillColor = nonStrokingColor.toRGB();
        }

        @Override
        public String getName() {
            return "f*";
        }
    }

然后在 processTextPosition 中,我尝试获取此 fillColor 并将其映射到每个字符(假设内容流以连续方式工作-在 Fill 运算符完成,接下来所有 processTextPosition 字符都应具有此 fillColor 。但这不是事实,所有字符的颜色都错误。this我是在尝试处理时,第二行填充有蓝色,我想为该行中的每个字符获取蓝色,为白行中的每个字符获取白色。PDFBox是否可以?

1 个答案:

答案 0 :(得分:1)

与示例文档有关的问题

  

然后在processTextPosition中,我尝试获取此fillColor并将其映射到每个字符(假设内容流以连续的方式工作-填充运算符完成后,所有下一个到达processTextPosition字符应带有此fillColor。但这不是事实,所有字符的颜色都有误。

您发现,您的假设对于手头的PDF是错误的。本文档中的策略是首先绘制所有背景材料,然后绘制所有文本。因此,您对本文档的处理方式应始终返回背景材料最后一点的颜色。

如您在此处引用的第二个问题的my comment中所述,您必须收集平行于实际文本提取的所有矩形(或更通用的路径),并检查字体渲染颜色是否(s)(取决于文本呈现模式,它也可能是StrokingColor!)与位于文本位置的当前顶部填充路径的文本一致。

您想知道一条评论

  

这是否意味着该方法适用于所有文档?

此方法是否适用于所有文档

它对很多人有用,但不是全部。

立即想到以下问题:

  • 并非所有颜色空间都支持您使用的toRGB方法。 (我刚刚检查了一下,我对有多少PDFBox确实实现感到非常惊讶。)

    特别是在使用图案颜色的情况下,您必须对图案及其使用情况进行大量挖掘,才能找到实际的背景颜色。

  • 还有其他方法可以绘制背景表格,尤其是:

    • 该方法仅考虑填充路径,但是如果您为图形状态线宽度或拉伸变换矩阵使用较大的值,则描边线也可以绘制矩形形式。因此,在这种情况下,您还必须考虑笔触路径。

    • 背景可能是位图图像。在这种情况下,您必须分析图像以获取背景颜色

    • 要考虑的另一个替代方法是阴影填充。通常这也会在背景中产生多种颜色。

  • 此后在字形上绘制而不是覆盖字形的表单可能会大大改变前景和背景。有例如是混合模式,可以从背景获得色调,从前景获得饱和...

  • 在绘制背景或前景时启用的蒙版也可能会引起人们的兴趣。

  • ...