我使用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);
因此,内部这些文本可以单独使用“textblocks”。 我的问题是:我有办法单独访问这些块吗?
在这段代码的输出下面,sort标志为true
标题PDF MIC
Vandaag meer dan 1 pagina
门mij geschreven1
标题PDF MIC
Dan is dit pagina 2
Met meel meer teksten en woorden。2
这是sort标志为false的输出
标题PDF MIC
1
Vandaag meer dan 1 pagina
门mij geschreven
标题PDF MIC
2
Dan is dit pagina 2
Met veel meer teksten en woorden。
答案 0 :(得分:1)
感谢@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));
}
}
}
}
输出
神器 - &gt; [ - ,, 1 ,, - ,] COSDictionary {COSName {附}:COSArray {[COSName {顶}]}; {COSName类型}:{COSName分页};}
神器 - &gt; [] COSDictionary {COSName {附}:COSArray {[COSName {底部}]}; {COSName类型}:{COSName分页};}
P - &gt; [M,J ,, - ,2,0,1,6,2,1,7,2 ,, /,B,] COSDictionary {COSName {MCID}:COSInt {0};}