2017-05-17 1 views
1

Je suis en train d'analyser des documents PDF avec PDFBox version 2.0 d'apache J'ai vu beaucoup de questions sur la séparation de l'en-tête/pied de page du contenu réel. Mes résultats sont qu'il existe une certaine notion (dans mon exemple de PDF) de ces sections, car l'indicateur SortByPosition a un effet sur l'ordre dans lequel le contenu est écrit dans le texte. Quand je mets SortByPosition à false, j'obtiens d'abord l'en-tête/pied de page et ensuite le corps (et ceci se répète pour chaque page). Lorsque je définis la propriété SortByPostion sur true, le contenu est affiché dans l'ordre tel qu'il apparaît à l'écran dans mon lecteur PDF.Apache PDFBox PDFTextStripper accéder à des parties du texte de la page, comment puis-je?

PDFTextStripper textStripper = new PDFTextStripper(); 
textStripper.setSortByPosition(true); 

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

Donc interne ces textes sont disponibles en "blocs de texte" séparés. Ma question est la suivante: y a-t-il un moyen pour moi d'accéder à ces blocs séparément?

Ci-dessous la sortie de ce morceau de code avec le drapeau de tri true

tête PDF MIC

Vandaag meer dan 1 Pagina
Porte mij geschreven

Header PDF MIC

Dan est dit pagina 2
Voir plus de détails sur ce produit.

Et ceci est la sortie avec le drapeau de tri false

tête PDF MIC

Vandaag meer dan 1 Pagina

Porte mij geschreven

tête PDF MIC

Dan est dit Pagina 2

Met veel meer teksten en woorden.

+1

Si vous connaissez les coordonnées, utilisez PDFTextStripperByArea. Nos remerciements –

+0

PDF @TilmanHausherr seront fournis par différents fournisseurs, nous faisons cela, je ne sais pas la mise en page/coordonnées à l'avance, mais nous pouvons prendre un en-tête/pied de page numéro/page de bien de PDF/A Conformité. Si vous obtenez – mpjjonker

+1

PDF de fournisseurs différents, Pourquoi pensez-vous que vous pouvez utiliser de la structure interne d'un pour analyser eux PDF Tous? * On peut supposer un en-tête/pied de page/numéro de page * Mais comment ne * d'être reconnu par une machine? Pensez de critères appropriés à votre cas d'utilisation, alors je pourrais vous aider à mettre nous dis. * PDF/A Conformité * Quelle saveur? PDF/A-1a? 1b? 2a? 2b? 2u? 3a? 3b? 3? Ce – mkl

Répondre

1

Merci à @mkl pour les trucs et astuces, voici wat je l'ai fait:

morceau de code Java qui utilise le PDFMarkedContentExtractor, cela ne prend la première page, mais nous pouvons l'appliquer à toutes les pages . Ci-dessous le code, vous pouvez trouver la sortie du journal 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)); 
          }   

         } 
        } 

       } 

Sortie

Artifact -> [- ,, 1 ,, -,] COSDictionary COSName {{{} attaché COSArray [COSName {Top}]}; COSName {type} : Pagination COSName {};}

Artifact -> [] COSDictionary COSName {{{} attaché COSArray [COSName bas {}]};} {COSName type: COSName Pagination {};}

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