web-dev-qa-db-fra.com

extraire des images de pdf en utilisant pdfbox

J'essaie d'extraire des images d'un pdf en utilisant pdfbox. L'exemple pdf ici

Mais je reçois uniquement des images vierges.

Le code que j'essaye: -

public static void main(String[] args) {
   PDFImageExtract obj = new PDFImageExtract();
    try {
        obj.read_pdf();
    } catch (IOException ex) {
        System.out.println("" + ex);
    }

}

 void read_pdf() throws IOException {
    PDDocument document = null; 
    try {
        document = PDDocument.load("C:\\Users\\Pradyut\\Documents\\MCS-034.pdf");
    } catch (IOException ex) {
        System.out.println("" + ex);
    }
    List pages = document.getDocumentCatalog().getAllPages();
    Iterator iter = pages.iterator(); 
    int i =1;
    String name = null;

    while (iter.hasNext()) {
        PDPage page = (PDPage) iter.next();
        PDResources resources = page.getResources();
        Map pageImages = resources.getImages();
        if (pageImages != null) { 
            Iterator imageIter = pageImages.keySet().iterator();
            while (imageIter.hasNext()) {
                String key = (String) imageIter.next();
                PDXObjectImage image = (PDXObjectImage) pageImages.get(key);
                image.write2file("C:\\Users\\Pradyut\\Documents\\image" + i);
                i ++;
            }
        }
    }

}

Merci

29

Voici le code utilisant PDFBox 2.0.1 qui obtiendra une liste de toutes les images du PDF. Ceci est différent de l'autre code dans la mesure où il recursera le document au lieu d'essayer d'obtenir les images du niveau supérieur.

public List<RenderedImage> getImagesFromPDF(PDDocument document) throws IOException {
        List<RenderedImage> images = new ArrayList<>();
    for (PDPage page : document.getPages()) {
        images.addAll(getImagesFromResources(page.getResources()));
    }

    return images;
}

private List<RenderedImage> getImagesFromResources(PDResources resources) throws IOException {
    List<RenderedImage> images = new ArrayList<>();

    for (COSName xObjectName : resources.getXObjectNames()) {
        PDXObject xObject = resources.getXObject(xObjectName);

        if (xObject instanceof PDFormXObject) {
            images.addAll(getImagesFromResources(((PDFormXObject) xObject).getResources()));
        } else if (xObject instanceof PDImageXObject) {
            images.add(((PDImageXObject) xObject).getImage());
        }
    }

    return images;
}
22
Matt

Le GetImagesFromPDF Java ci-dessous récupère toutes les images dans le fichier 4-Request-Headers.pdf et enregistre ces fichiers dans le dossier de destination PDFCopy .

import Java.io.File;
import Java.util.Iterator;
import Java.util.List;
import Java.util.Map;

import org.Apache.pdfbox.pdmodel.PDDocument;
import org.Apache.pdfbox.pdmodel.PDPage;
import org.Apache.pdfbox.pdmodel.PDResources;
import org.Apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;

@SuppressWarnings({ "unchecked", "rawtypes", "deprecation" })
public class GetImagesFromPDF {
    public static void main(String[] args) {
        try {
            String sourceDir = "C:/PDFCopy/04-Request-Headers.pdf";// Paste pdf files in PDFCopy folder to read
            String destinationDir = "C:/PDFCopy/";
            File oldFile = new File(sourceDir);
            if (oldFile.exists()) {
            PDDocument document = PDDocument.load(sourceDir);

            List<PDPage> list = document.getDocumentCatalog().getAllPages();

            String fileName = oldFile.getName().replace(".pdf", "_cover");
            int totalImages = 1;
            for (PDPage page : list) {
                PDResources pdResources = page.getResources();

                Map pageImages = pdResources.getImages();
                if (pageImages != null) {

                    Iterator imageIter = pageImages.keySet().iterator();
                    while (imageIter.hasNext()) {
                        String key = (String) imageIter.next();
                        PDXObjectImage pdxObjectImage = (PDXObjectImage) pageImages.get(key);
                        pdxObjectImage.write2file(destinationDir + fileName+ "_" + totalImages);
                        totalImages++;
                    }
                }
            }
        } else {
            System.err.println("File not exists");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

10
pudaykiran

Pour PDFBox 2.0.1, la réponse de pudaykiran doit être légèrement modifiée car certaines API ont été modifiées.

public static void testPDFBoxExtractImages() throws Exception {
    PDDocument document = PDDocument.load(new File("D:/Temp/Test.pdf"));
    PDPageTree list = document.getPages();
    for (PDPage page : list) {
        PDResources pdResources = page.getResources();
        for (COSName c : pdResources.getXObjectNames()) {
            PDXObject o = pdResources.getXObject(c);
            if (o instanceof org.Apache.pdfbox.pdmodel.graphics.image.PDImageXObject) {
                File file = new File("D:/Temp/" + System.nanoTime() + ".png");
                ImageIO.write(((org.Apache.pdfbox.pdmodel.graphics.image.PDImageXObject)o).getImage(), "png", file);
            }
        }
    }
}
7
PerseusBC

Ajoutez simplement le .jpeg à la fin de votre chemin:

image.write2file("C:\\Users\\Pradyut\\Documents\\image" + i + ".jpeg");

Ça marche pour moi.

2
Jorge

Vous pouvez utiliser la fonction PDPage.convertToImage() qui peut convertir la page PDF en une BufferedImage. Ensuite, vous pouvez utiliser la BufferedImage pour créer une image.

Utilisez la référence suivante pour plus de détails:

  • Tous PDF classes realated dans PDFBox vous pouvez obtenir Apache PDFBox 1.8.3 API
  • Ici vous pouvez voir la documentation relative à PDPage.

Et n'oubliez pas de rechercher la fonction PDPage.convertToImage() dans la classe PDPage.

2
Abhay Pai

Au lieu d'appeler

image.write2file("C:\\Users\\Pradyut\\Documents\\image" + i);

Vous pouvez utiliser la méthode statique ImageIO.write() pour écrire l'image RVB dans le format dont vous avez besoin. Ici, j'ai utilisé PNG:

File outputFile = new File( "C:\\Users\\Pradyut\\Documents\\image" + i + ".png");
ImageIO.write( image.getRGBImage(), "png", outputFile);
0
nickb