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

时间:2017-05-17 15:33:26

标签: java extract pdfbox

我使用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 geschreven

     

1

     

标题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。

1 个答案:

答案 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};}