在示例文件中忽略文本的一个可能标准是文本颜色,在一种情况下为纯 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”年: