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 ?).
Merci je veux verifier, je vous direz si ça marché
Coordiallement
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.
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
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.
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.