[Writer] Exporter sur disque les images intégrées

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur: Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.

[Writer] Exporter sur disque les images intégrées

Messagepar Dude » 03 Août 2011 13:45

La macro ci-dessous permet l'exportation sur le disque des images contenues dans un document.

Code : Tout sélectionner   AgrandirRéduire
Sub ListeImages
   ' ****************************************************
   ' Macro fournie par le forum officiel OOo / LibO
   ' http://user.services.openoffice.org/fr/forum
   ' Merci de garder le présent encart si vous réutilisez
   ' tout ou partie de ce code
   ' ****************************************************
   
   Dim sRep As string
   sRep = "c:\temp\" ' Modifier le chemin si Linux
   
   Dim oDoc As Object
   Dim oImages As Object, oImage As Object
   Dim sImageUrl as string, sImageExt as string
   Dim sImage as string
   Dim mData() as variant
   Dim oFic as Object, oExp as object
   
   oDoc = ThisComponent
   
   oImages = oDoc.GraphicObjects
   
   ' Prendre la 1ere image intégrée (index à zéro)
   oImage = oImages(0)
   
   ' Extraire son nom
   sImageUrl = Mid (oImage.GraphicURL, 28)
   ' Quel est le type de l'image
   sImageExt = Right (oImage.Graphic.MimeType, 3)
   ' Ce qui donne le nom comlet
   sImage = sImageUrl & "." & sImageExt
   
   ' Extraction du fichier dans un flux binaire
   oFic = oDoc.DocumentStorage.getByName("Pictures").getByName(sImage)
   oFlux = oFic.InputStream
   oURL = ConvertToUrl(sRep & sImage)
   kill oURL
   
   ' Export dans le fichier
   oExp = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
   ofw = oExp.openFileWrite(oURL)
   n = -1
   While n <> 0
         n = oFlux.readBytes(mData(), 50000)
         ofw.writeBytes(mData())
   Wend
   ofw.flush()
   ofw.closeOutput()

End sub


liste_images.odt
(30.56 Kio) Téléchargé 267 fois


 Ajout : Sur le conseil judicieux de Churay, il est recommandé de tester plus fortement le type MIME du fichier.
Ce dernier pouvant donner des surprises comme expliqué dans ce sujet
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20939
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

Re: [Writer] Exporter sur disque les images intégrées

Messagepar bm92 » 05 Août 2011 09:29

Salut,
Bel effort de codage!

Utiliser le MimeType pour en déduire l'extension n'est pas idéal; on peut retrouver l'extension du fichier d'une autre manière.
Dans le répertoire "Pictures" du fichier document, les noms complets des images (nom interne et extension) sont accessibles.
Code : Tout sélectionner   AgrandirRéduire
Dim pics As Object
pics = oDoc.DocumentStorage.getByName("Pictures")
xray pics.ElementNames

Tu connais déjà le nom interne sans l'extension : sImageUrl
Balayer le tableau ElementNames pour retrouver une chaîne qui commence comme sImageUrl. Cette chaîne est le nom complet, avec extension.


L'écriture du fichier image peut se faire plus simplement:
Code : Tout sélectionner   AgrandirRéduire
oFic = oDoc.DocumentStorage.getByName("Pictures").getByName(sImage)
oExp.writeFile(oURL, oFic)

Pas besoin de flush ni closeOutput. Un fichier existant est écrasé.
Bernard

OpenOffice.org 1.1.5 fr / Apache OpenOffice 4.1.1 / LibreOffice 5.0.5.2 (X64)
MS-Windows 7 SP1 64bits Familial
bm92
ManitOOu
ManitOOu
 
Message(s) : 2562
Inscrit le : 26 Nov 2005 14:42

Re: [Writer] Exporter sur disque les images intégrées

Messagepar Dude » 05 Août 2011 10:36

bm92 a écrit:Utiliser le MimeType pour en déduire l'extension n'est pas idéal; on peut retrouver l'extension du fichier d'une autre manière.

Effectivement mais juste un bémol. Si l'extension de l'image a été renommée (PNG en JPG par ex.), l'entête MIME restera l'information la plus sûre.
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20939
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

Re: [Writer] Exporter sur disque les images intégrées

Messagepar bm92 » 05 Août 2011 11:31

Alors j'ai fait l'essai : insérer une image jpeg renommée avec une extension .png.
Le document sauve l'image en mettant l'extension correspondant au type Mime trouvé par analyse de l'image, et non pas l'extension du fichier image.
Et ceci même si l'extension était correcte, par exemple .JPG devient .jpg.
Bernard

OpenOffice.org 1.1.5 fr / Apache OpenOffice 4.1.1 / LibreOffice 5.0.5.2 (X64)
MS-Windows 7 SP1 64bits Familial
bm92
ManitOOu
ManitOOu
 
Message(s) : 2562
Inscrit le : 26 Nov 2005 14:42

Re: [Writer] Exporter sur disque les images intégrées

Messagepar Churay » 05 Août 2011 12:58

yeap ;)

Si je suis bien : l'entête mime reste une valeur sûre (en y réfléchissant bien : on pourrait s'y attendre), même si on zappe carrément la gestion de l'extension.
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2668
Inscrit le : 30 Avr 2009 05:54
Localisation : CATALUNYA


Retour vers Suprême de code

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : TheofilG et 1 invité