如何使用 PDFBox 识别和删除 PDF 中的隐藏文本 java

How to identify and remove hidden text from the PDF using PDFBox java

我正在使用 pdfbox 库从 PDF 中读取文本并将其保存在文本文件中。它也读取隐藏文本,当通过 PDF Reader 查看 PDF 时隐藏文本不可见。我的要求是获取这些隐藏文本的一些特征,可以将其与普通文本区分开来。

示例文件中要忽略的文本的一个可能标准是文本颜色,在一种情况下为纯 CMYK 白色,在 Gray Gamma 2.2 XYZ ICCBased 颜色空间中为 0.753其他情况。

所以让我们通过颜色过滤选项扩展文本剥离器。这特别意味着为颜色设置指令添加运算符处理器,因为 PDFTextStripper 默认情况下会忽略它们:

public class PDFFilteringTextStripper extends PDFTextStripper {
    public interface TextStripperFilter {
        public boolean accept(TextPosition text, PDGraphicsState graphicsState);
    }

    public PDFFilteringTextStripper(TextStripperFilter filter) throws IOException {
        addOperator(new org.apache.pdfbox.contentstream.operator.color.SetStrokingColorSpace());
        addOperator(new org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColorSpace());
        addOperator(new org.apache.pdfbox.contentstream.operator.color.SetStrokingColor());
        addOperator(new org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColor());
        addOperator(new org.apache.pdfbox.contentstream.operator.color.SetStrokingColorN());
        addOperator(new org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColorN());
        addOperator(new org.apache.pdfbox.contentstream.operator.color.SetStrokingDeviceGrayColor());
        addOperator(new org.apache.pdfbox.contentstream.operator.color.SetNonStrokingDeviceGrayColor());
        addOperator(new org.apache.pdfbox.contentstream.operator.color.SetStrokingDeviceRGBColor());
        addOperator(new org.apache.pdfbox.contentstream.operator.color.SetNonStrokingDeviceRGBColor());
        addOperator(new org.apache.pdfbox.contentstream.operator.color.SetStrokingDeviceCMYKColor());
        addOperator(new org.apache.pdfbox.contentstream.operator.color.SetNonStrokingDeviceCMYKColor());

        this.filter = filter;
    }

    @Override
    protected void processTextPosition(TextPosition text) {
        PDGraphicsState graphicsState = getGraphicsState();
        if (filter.accept(text, graphicsState))
            super.processTextPosition(text);
    }

    final TextStripperFilter filter;
}

(PDFFilteringTextStripper class)

使用文本剥离器 class,我们可以像这样从第一个示例 PDF 中过滤白色文本:

float[] colorToFilter = new float[] {0,0,0,0};

PDDocument document = ...;
PDFFilteringTextStripper stripper = new PDFFilteringTextStripper((text, gs) -> {
    PDColor color = gs.getNonStrokingColor();
    return color == null || !((color.getColorSpace() instanceof PDDeviceCMYK) && Arrays.equals(color.getComponents(), colorToFilter));
});
String text = stripper.getText(document);

(ExtractFilteredText 测试 testExtractNoWhiteText...)

类似地,我们可以像这样过滤第二个示例 PDF 中的灰色文本:

float[] colorToFilter = new float[] {0.753f};

PDDocument document = ...;
PDFFilteringTextStripper stripper = new PDFFilteringTextStripper((text, gs) -> {
    PDColor color = gs.getNonStrokingColor();
    return color == null || !((color.getColorSpace() instanceof PDICCBased) && Arrays.equals(color.getComponents(), colorToFilter));
});
String text = stripper.getText(document);

(ExtractFilteredText 测试 testExtractNoGrayText...)


在您提问的评论中

A quick question- this text in 0.753 in a Gray Gamma 2.2 XYZ ICCBased colorspace - invisible text? Or is it just because of the colorspace, text is not visible in PDF?

可见!(因此,严格来说,您应该将其从提取的文本中删除。)

只是比较小。在扉页上放大年份“2016”: