Pour des besoins personnels, j'ai eu besoin d'extraire les images contenues dans un PDF.
Tout le travail est fait par la librairie PDFBox d'Apache, mon application n'est qu'une interface.
On peut sélectionner un PDF et un répertoire d'extraction avant de lancer le traitement. Les images ne sont pas réencodées : le format d'origine est conservé (jpg, png, bmp...).
La limite du zip à 1Mo ne m'autorise pas à intégrer les librairies Apache nécessaires :
- commons-logging-1.1.1.jar
- pdfbox-1.5.0.jar
Il faudra donc les télécharger et les mettre dans le dossier "librairies" afin de faire fonctionner l'application sinon vous aurez le droit à une jolie NoClassDefFoundError.
Source / Exemple :
compteurImages = 0;
presentation.setProgressionIndefinie();
/*
- on charge le PDF en memoire et on recupere la liste de ses pages
- /
PDDocument pdf = PDDocument.load(fichierPdf);
PDDocumentCatalog catalogue = pdf.getDocumentCatalog();
List pages = catalogue.getAllPages();
int nombrePages = pages.size();
presentation.setNombrePages(nombrePages);
PDPage page;
PDResources ressources;
Map images;
Set cles;
Iterator iterateurCles;
String cle;
PDXObjectImage image;
/*
- on parcourt les pages du PDF
- /
for (int numeroPage = 0; numeroPage < nombrePages; numeroPage++) {
page = (PDPage) pages.get(numeroPage);
presentation.setNumeroPage(numeroPage);
/*
- on recupere toutes les images de la page en cours
- /
ressources = page.getResources();
images = ressources.getImages();
cles = images.keySet();
iterateurCles = cles.iterator();
/*
- on extrait chaque image dans le dossier d'extraction
- /
while (iterateurCles.hasNext()) {
cle = (String) iterateurCles.next();
image = (PDXObjectImage) images.get(cle);
image.write2file(repertoireExtraction.getPath() + "/image_extraite_"
+ FORMAT_COMPTEUR.format(compteurImages++));
}
}
/*
- on n'oublie pas de fermer le PDF
- /
pdf.close();
Conclusion :
Pas grand chose à dire, si ce n'est que le traitement est étonnamment lent (la faute à PDFBox ?).
27 avril 2011 à 16:11
27 avril 2011 à 17:14
1) vérifie que Java est installé sur ton ordinateur en version 1.6 minimum (le plus simple est de taper la commande "java -version" dans un terminal). Si Java n'est pas installé ou que la version n'est pas suffisante, télécharge Java 1.6 ici : http://java.com/fr/download/index.jsp
2) télécharge le zip que je fournis, décompresse-le où tu veux
3) dans le dossier "librairies" que je fournis, il n'y a que "utilitaire.jar" qui est une librairie personnelle. Il manque 2 librairies Apache pour que l'application fonctionne :
- http://www.java2s.com/Code/JarDownload/commons-logging-1.1.1.jar.zip (à décompresser)
- http://apache.crihan.fr/dist//pdfbox/1.5.0/pdfbox-1.5.0.jar
Tu mets les 2 jar ("commons-logging-1.1.1.jar" et "pdfbox-1.5.0.jar") dans le dossier librairies (avec "utilitaire.jar").
(Je ne peux pas fournir moi-même ces librairies dans le zip parce qu'elles sont trop volumineuses.)
4) Ensuite tu peux exécuter extraction_pdf.jar (double-clic)
27 avril 2011 à 17:15
http://java.com/es/download/index.jsp
9 juil. 2011 à 13:00
c vrai que PDFBOX est en fait très lent, tout simplement parce qu'il charge tout le contenu de fichier Pdf à proceder dans le Memoire; toutes les ressources de toutes les pages sont lus... imaginez ce que cela peut donner juste pour un fichier à seulement 10 Pages... charger des ressources comme les images peuvent être tres penibles....
Essayer "iText", une open-source pour Java/C# qui fait la même chose ,mais plus rapidement en chargeant:
1- le contenu du pdf est crée selon le User-input ou la source de donnée (Base de données) en temps reel.
2- Création , lecture et mis à jour des Document pdf
concernant la lecture d'un document pdf et ses ressources, la library travaille avec et met à la disposition des flux (Stream) ce qui accroit la performance, car cela permet de charger ses ressources en flux... de maniere sequentielle.
PDFBox Vs iText c'est un peu comme XMLDOM vs SAX dans le monde du XML.
9 juil. 2011 à 13:48
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.