Apache PDFBox PDFTextStripper 访问页面的文本部分,我该怎么做?



我正在使用apache的PDFBox版本2.0.x解析PDF文档 我看到了很多关于将页眉/页脚与实际内容分开的问题。 我的发现是,这些部分有一些概念(在我的示例PDF中),因为SortByPosition标志对内容写入文本的顺序有影响。 当我将 SortByPosition 设置为 false 时,我首先得到页眉/页脚,然后得到正文(并且每页都重复此操作)。 当我将 SortByPostion 设置为 true 时,我按照 PDF 阅读器中屏幕上显示的顺序获取内容。

PDFTextStripper textStripper = new PDFTextStripper();
textStripper.setSortByPosition(true);
String content = textStripper.getText(pdf);
System.out.println(content);

因此,在内部,这些文本片段可以单独使用"文本块"。 我的问题是:有没有办法让我单独访问这些块?

在这段代码的输出下方,排序标志为 true

页眉 PDF 麦克风

Vandaag meer dan 1 pagina
Door mij geschreven

1

页眉 PDF 麦克风

Dan is dit pagina 2
Met veel meer teksten en woorden.

阿拉伯数字

这是排序标志为 false 的输出

页眉 PDF 麦克风

1

Vandaag meer dan 1 pagina

Door mij geschreven

页眉 PDF 麦克风

阿拉伯数字

Dan is dit pagina 2

Met veel meer teksten en woorden.

感谢@mkl的提示和技巧,这是我做的:

一段使用 PDFMarkedContentExtractor 的 Java 代码,它只占用第一页,但我们可以将其应用于所有页面。 在代码下方,您可以找到 System.out 日志的输出。

ExtraMetaData emd = new ExtraMetaData(); //this my own class to carry the header and footer    
PDFMarkedContentExtractor markedContentExtractor = new PDFMarkedContentExtractor();
markedContentExtractor.processPage(document.getPage(0));
List<PDMarkedContent>  markedContents = markedContentExtractor.getMarkedContents();
for (Iterator iterator = markedContents.iterator(); iterator.hasNext();) {
PDMarkedContent pdMarkedContent = (PDMarkedContent) iterator.next();
System.out.println(pdMarkedContent.getTag()+" --> "+pdMarkedContent.getContents()+ " "+pdMarkedContent.getProperties());
COSDictionary pdmcProperties = pdMarkedContent.getProperties();
if (pdmcProperties.containsKey("Subtype")) {
COSBase cosBase =  pdmcProperties.getDictionaryObject("Subtype");
if (((COSName)cosBase).getName().equalsIgnoreCase("Footer")) {
emd.setFooter(getContentAsString(pdMarkedContent));
}
if (((COSName)cosBase).getName().equalsIgnoreCase("Header")) {
emd.setHeader(getContentAsString(pdMarkedContent));
}           
}
if (pdmcProperties.containsKey("Attached")) {
COSArray cosArray = (COSArray) pdmcProperties.getDictionaryObject("Attached");
for (COSBase cosBase2 : cosArray) {
if (((COSName)cosBase2).getName().equalsIgnoreCase("Bottom")) {
emd.setFooter(getContentAsString(pdMarkedContent));
}
if (((COSName)cosBase2).getName().equalsIgnoreCase("Top")) {
emd.setHeader(getContentAsString(pdMarkedContent));
}           
}
}
}

输出

工件 --> [-, , 1, , -, ] COSDictionary{COSName{Attached}:COSArray{[COSName{Top}]};COSName{Type}:COSName{Pagination};}

神器 --> [ ] COSDictionary{COSName{Attached}:COSArray{[COSName{Bottom}]};COSName{Type}:COSName{Pagination};}

P --> [M, J, , -, , 2, 0, 1, 6, 2, 1, 7, 2, ,/, , B, ] COSDictionary{COSName{MCID}:COSInt{0};}

相关内容

最新更新