【问题标题】:How to identify and remove hidden text from the PDF using PDFBox java如何使用 PDFBox java 识别和删除 PDF 中的隐藏文本
【发布时间】:2020-09-17 10:30:24
【问题描述】:

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

【问题讨论】:

  • 对于一些想法,请查看questions of D.F. Stones 和相应的答案;这里已经访问了许多选项。
  • 感谢@mkl 分享您的观点。我遇到了您分享的几个解决方案并尝试应用它,它确实可以删除 PDF 的一些隐藏文本。但是 PDF 中仍然有一些隐藏的文本以特定角度旋转,我也需要从输出中删除该文本。您能否分享一些您的见解以解决此问题?
  • 仅供参考。我使用了这里提到的解决方案。 stackoverflow.com/questions/47908124/…
  • “但 PDF 中仍有一些隐藏的文本以特定角度旋转,我也需要从输出中删除该文本。您能否分享一些您的见解解决此问题?” - 请分享相关 PDF 以供分析。

标签: pdfbox


【解决方案1】:

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

所以让我们通过一个颜色过滤选项来扩展文本剥离器。这尤其意味着为颜色设置指令添加操作员处理器,因为 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 类)

使用该文本剥离器类,我们可以像这样过滤第一个示例 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...)


在你问的评论中

一个简单的问题 - 灰色 Gamma 2.2 XYZ ICCBased 颜色空间中的 0.753 中的文本 - 不可见文本?还是仅仅因为色彩空间,PDF 中看不到文本?

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

它只是很小。在扉页上放大“2016”年:

【讨论】:

  • 这行得通,谢谢 :) 一个简单的问题 - 灰色 Gamma 2.2 XYZ ICCBased 颜色空间中 0.753 中的文本 - 不可见文本?还是仅仅因为色彩空间,文本在 PDF 中不可见?
  • 我必须核实一下。我稍后再看。
  • 好的。再次感谢:)
  • 查看我的答案的编辑,它根本不是隐形的,只是很小。
  • 哦,是的,它太奇怪了。你能检查一下这个PDF吗?它在页脚中有一些文字“绿色债券 - 由德国复兴信贷银行制造......”此文字是可搜索的,颜色为暗灰色但不可见。可能是什么原因?drive.google.com/file/d/1epCmrJ1lsM9o5X_m3xgVVqhmyYY6Lf1O/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 2021-02-21
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多