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

Apache PDFBox PDFTextStripper access text parts of the page, how can I?

我正在使用 apache 的 PDFBox 版本 2 解析 PDF 文档。0.x 我已经看到很多关于将 header/footer 与实际内容分开的问题。 我的发现是这些部分有一些概念(在我的示例 PDF 中),因为 SortByPosition 标志对内容写入文本的顺序有影响。 当我将 SortByPosition 设置为 false 时,我首先得到 header/footer 然后是正文(并且这对每一页重复)。 当我将 SortByPostion 设置为 true 时,我会按照 PDF Reader.

屏幕上显示的顺序获取内容
PDFTextStripper textStripper = new PDFTextStripper();
textStripper.setSortByPosition(true);

String content = textStripper.getText(pdf);
System.out.println(content);

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

下面是排序标志为真的这段代码的输出

Header PDF MIC

Vandaag meer dan 1 pagina
Door mij geschreven

1

Header PDF MIC

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

2

这是排序标志为 false 的输出

Header PDF MIC

1

Vandaag meer dan 1 pagina

Door mij geschreven

Header PDF MIC

2

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));
                            }           

                        }
                    }

                }

输出

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

Artifact --> [ ] 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};}