2017-09-14 1 views
0

J'ai besoin d'extraire le texte d'un pdf pour valider un certain contenu et compter le nombre d'images dans le document pdf en utilisant java. Je peux obtenir le contenu du texte sans problèmes en utilisant la fonction getText ci-dessous, mais ne peux pas trouver un moyen de compter uniquement sur les objets image. J'ai été en mesure d'obtenir un compte de tous les objets en utilisant le code ci-dessous, mais je ne trouve pas de doco sur la façon de ne compter que les images. Toutes les idées seraient très appréciées. Mercicount images en pdf en utilisant pdfbox

static String getText(File pdfFile) throws IOException { 
    PDDocument doc = PDDocument.load(pdfFile); 
    return new PDFTextStripper().getText(doc); 
} 

static void countImages(File pdfFile) throws IOException{ 

    PDDocument doc = PDDocument.load(pdfFile); 
    List myObjects = doc.getDocument().getObjects(); 
    System.out.println("Count: " + myObjects.size()); 
    doc.close(); 

} 

Répondre

1

Une solution rapide et sale pourrait ressembler à ceci:

static void countImages(File pdfFile) throws IOException{ 
    PDDocument doc = PDDocument.load(pdfFile); 
    PDResources res = doc.getDocumentCatalog().getPages().getResources(); 

    int numImg = 0; 
    for (PDXObject xobject : res.getXObjects().values()) { 
     if (xobject instanceof PDXObjectImage) { 
      numImg++; 
     } 
    } 
    System.out.println("Count: " + numImg); 

    doc.close(); 
} 
+1

cela ne tient pas un assez grand nombre de places images peuvent être. De plus, il n'y a aucune garantie qu'une image dans les ressources d'une page est réellement utilisée. – mkl

+0

@mkl Intéressant mais vague. Pourquoi ne partagez-vous pas vos perles de sagesse et postez une meilleure réponse? J'ai utilisé mon approche pour seulement deux cas de test qui devaient s'assurer qu'un pdf spécifique contenait une image ou pas. Comme cela a fonctionné de manière fiable, je n'ai pas plongé plus profondément dans ce sujet. –

+0

@ Würgspaß jetez un oeil sur le code source ExtractImages dans le téléchargement du code source ou ici https://svn.apache.org/viewvc/pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/ ExtractImages.java?view=markup –

1

Cela devrait faire l'affaire:

public static void main(String[] args) throws IOException { 
    PDDocument document = PDDocument.load(new File("")); 

    int numImages = 0; 
    for (int i = 0; i < document.getNumberOfPages(); i++) 
    { 
     PDPage page = document.getPage(i); 

     CountImages countImages = new CountImages(page); 
     countImages.processPage(page); 

     numImages += countImages.numImages; 
    } 

    System.out.println(numImages); 
} 

static class CountImages extends PDFGraphicsStreamEngine { 
    public int numImages = 0; 
    private final Set<COSStream> duplicates = new HashSet<>(); 

    protected CountImages(PDPage page) throws IOException 
    { 
     super(page); 
    } 

    @Override 
    public void appendRectangle(Point2D pd, Point2D pd1, Point2D pd2, Point2D pd3) throws IOException { 
    } 

    @Override 
    public void drawImage(PDImage pdImage) throws IOException { 
     if (pdImage instanceof PDImageXObject) { 
      PDImageXObject xobject = (PDImageXObject)pdImage; 

      if (duplicates.contains(xobject.getCOSObject()) == false) { 
       numImages++; 
       duplicates.add(xobject.getCOSObject()); 
      } 
     } else { 
      numImages++; //means its an inline image 
     } 
    } 

    @Override 
    public void clip(int i) throws IOException { 
    } 

    @Override 
    public void moveTo(float f, float f1) throws IOException { 
    } 

    @Override 
    public void lineTo(float f, float f1) throws IOException { 
    } 

    @Override 
    public void curveTo(float f, float f1, float f2, float f3, float f4, float f5) throws IOException { 
    } 

    @Override 
    public Point2D getCurrentPoint() throws IOException { 
     return new Point2D.Float(0, 0); 
    } 

    @Override 
    public void closePath() throws IOException { 
    } 

    @Override 
    public void endPath() throws IOException { 
    } 

    @Override 
    public void strokePath() throws IOException { 
    } 

    @Override 
    public void fillPath(int i) throws IOException { 
    } 

    @Override 
    public void fillAndStrokePath(int i) throws IOException { 
    } 

    @Override 
    public void shadingFill(COSName cosn) throws IOException { 
    } 
}