Extraction des images contenues dans un pdf

Soyez le premier à donner votre avis sur cette source.

Vue 10 558 fois - Téléchargée 1 559 fois

Description

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 ?).

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
6
Date d'inscription
samedi 18 juin 2011
Statut
Membre
Dernière intervention
15 janvier 2013

Salut!!
Merci je veux verifier, je vous direz si ça marché
Coordiallement
Messages postés
519
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
19 décembre 2016
23
Salut,

commons-logging (1.1.1)
http://commons.apache.org/logging/download_logging.cgi

pdfbox (1.6.0)
http://apache.crihan.fr/dist/pdfbox/1.6.0/

Je n'ai pas testé avec pdfbox 1.6.0, il n'est pas garanti que ça marche. On pourra voir ça.
Messages postés
6
Date d'inscription
samedi 18 juin 2011
Statut
Membre
Dernière intervention
15 janvier 2013

Bonjour chers membres
Je me suis rendu sur http://www.java2s.com mais j'ai trouvé uniquement le fichier commons-logging-1.1.1.jar.html avec une suite des codes sources java au lieu commons-logging-1.1.1.jar.zip. S'il vous plait veiller me donner la procédure pour j'aie le Zip de commons-loggind-1.1.1.jar, aussi le pdfbox-1.5.0.jar je n'ai pas trouvé.
Chers membres du forum j'attends avec patience votre intervention ou s"il quelqu'un qui a trouvé le deux utilitaires (commons-logging-1.1.1.jar.zip,le pdfbox-1.5.0.jar)il peut me les envoyer au mail suivant theorwag@gmail.com
Merci
Messages postés
25
Date d'inscription
jeudi 14 décembre 2000
Statut
Membre
Dernière intervention
25 juillet 2013
1
:)
Messages postés
25
Date d'inscription
jeudi 14 décembre 2000
Statut
Membre
Dernière intervention
25 juillet 2013
1
Salut..

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.
Afficher les 8 commentaires

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.