[Résolu][Writer] Déplacer une image et la compresser

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
fab64
Fraîchement OOthentifié
Messages : 3
Inscription : 04 sept. 2021 22:23

[Résolu][Writer] Déplacer une image et la compresser

Message par fab64 »

Bonjour à tous,

je débute complètement sous Libreoffice et je ne trouve pas de solution malgré mes recherches sur le sujet ici et sur forums et sites anglophones.

Je voudrais coder une macro qui avec l'image sélectionnée dans Writer :
- la redimensionne
- la déplace sur la marge de gauche
- la compresse (même fonction que clic droit "compresser" avec les paramètres par défaut)
- ajoute une légende vierge (uniquement "Figure x :")

Pour le redimensionnement c'est fait mais je n'arrive à rien avec le reste.
Voici où j'en suis :

Code : Tout sélectionner

Sub ImageGauche
Dim g
Dim gPosition As New com.sun.star.awt.Point
    g = ThisComponent.CurrentSelection()
if g.supportsService("com.sun.star.text.TextGraphicObject")=false then
   msgbox "please select an image"
   exit sub
else
    TheBitmapSize=g.GetSize
    imageWidth=TheBitmapSize.Width
    imageHeight=TheBitmapSize.Height
    g.Width = 8200
    g.Height = 8200/imageWidth*imageHeight
    gposition.x=0
    g.setPosition(gposition)

end if
End Sub
J'ai parcouru le pdf d'Andrew Pitonyak qui m'a permis d'avancer un peu mais là je stagne.
Si vous avez quelques tuyaux ...
Libreoffice 6.3.6.2 sur Fedora 31
Avatar de l’utilisateur
Dolev
InconditiOOnnel
InconditiOOnnel
Messages : 945
Inscription : 19 août 2018 05:20

Re: [Writer]Déplacer une image et la compresser

Message par Dolev »

Bonjour,

Il y a une extension qui fait cela : https://forum.openoffice.org/fr/forum/v ... 06#p203906
Open Office 4.1.15 sous Windows 11
fab64
Fraîchement OOthentifié
Messages : 3
Inscription : 04 sept. 2021 22:23

Re: [Writer]Déplacer une image et la compresser

Message par fab64 »

Bonjour,

merci mais cette extension date de 2013, la fonction de compression d'images est maintenant intégrée dans Libreoffice Writer. Clic droit sur l'image et "Compresser". Ce que je cherche à faire c'est justement une macro qui appelle cette fonction. Je voudrais automatiser la compression, de même que l'ajout d'une légende et le positionnement de l'image sur la gauche de l'écran.
Libreoffice 6.3.6.2 sur Fedora 31
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25173
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Writer]Déplacer une image et la compresser

Message par Dude »

Salut,

Si c'est intégré, il y a donc une fonction UNO pour l'appeler. Sers toi de l'enregistreur.

Comme toujours, la réponse est faite hors contexte(*).



(*) Fournir le contexte signifie joindre un document explicatif et exhaustif permettant de comprendre et surtout reproduire la problématique.
fab64
Fraîchement OOthentifié
Messages : 3
Inscription : 04 sept. 2021 22:23

Re: [Writer]Déplacer une image et la compresser

Message par fab64 »

Bonjour à tous et merci pour vos réponses qui m'ont permis d'avancer,

j'avais l'impression que l'enregistreur ne fonctionnait pas mais en fait il mettait en remarque certaines lignes.
J'ai finalement réussi à faire à peu près ce que je voulais. Seul problème c'est que pour compresser et aussi pour ajouter une légende, la macro ouvre la boîte de dialogue mais ne ne permet pas de valider avec les paramètres par défaut de la boîte de dialogue. Il faut cliquer soi-même valider.
D'après ce post, il n'y a pas de moyen de simple de contourner le problème :
https://ask.libreoffice.org/t/automatization-compress-image-in-libreoffice-writer-macro-or-any-method/19928/2
Si quelqu'un a malgré tout une solution pour automatiser complètement la compression d'image et l'ajout de légendes, je suis preneur !

Voici ma macro :

Code : Tout sélectionner

Sub photoGauche
call ChangeSize(8200)
call margegauche
call compresser
call legende
End Sub

Sub ChangeSize(largeur As Integer)
Dim g
g = ThisComponent.CurrentSelection()
if g.supportsService("com.sun.star.text.TextGraphicObject")=false then
   msgbox "please select an image"
   exit sub
else
    TheBitmapSize=g.GetSize
    imageWidth=TheBitmapSize.Width
    imageHeight=TheBitmapSize.Height
    g.Width = largeur
    g.Height = largeur/imageWidth*imageHeight
end if
End Sub

sub margegauche
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:ObjectAlignLeft", "", 0, Array())
end sub

sub compresser
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:CompressGraphic", "", 0, Array())
end sub

sub legende
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:InsertCaptionDialog", "", 0, Array())
end sub
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libreoffice 6.3.6.2 sur Fedora 31
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25173
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Writer]Déplacer une image et la compresser

Message par Dude »

fab64 a écrit :cette extension date de 2013, la fonction de compression d'images est maintenant intégrée dans Libreoffice Writer.
Donc, ce n'est pas si bien intégré finalement. Comme toujours, le développeur qui a pondu ça n'a pas été jusqu'au bout en créant l'API.
Et dans ce cas, tu étudies le code de l'extension PixCompress qui reste toujours d'actualité depuis 2013. :lol:

Et pour l'insertion d'image avec légende, il suffit de faire un peu de recherche :
https://forum.openoffice.org/fr/forum/v ... C3%A9gende
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 626
Inscription : 09 août 2017 22:15

Re: [Writer]Déplacer une image et la compresser

Message par Jurassic Pork »

hello,
fab64 a écrit : J'ai finalement réussi à faire à peu près ce que je voulais. Seul problème c'est que pour compresser et aussi pour ajouter une légende, la macro ouvre la boîte de dialogue mais ne ne permet pas de valider avec les paramètres par défaut de la boîte de dialogue. Il faut cliquer soi-même valider.
D'après ce post, il n'y a pas de moyen de simple de contourner le problème :
https://ask.libreoffice.org/t/automatiz ... od/19928/2
Si quelqu'un a malgré tout une solution pour automatiser complètement la compression d'image et l'ajout de légendes, je suis preneur !
j'ai une solution à proposer pour pouvoir valider les fenêtres de ces boîtes de dialogue : comme c'est le bouton OK qui est sélectionné par défaut, simuler l'envoi de la touche return. Comme les fenêtres de dialogues sont bloquantes et donc on ne peut pas exécuter du code Basic pendant qu'elles sont ouvertes, l'astuce consiste à lancer juste avant une fonction qui envoie la touche return après un certain délai et ceci en macro python parce que :
1 - Il existe une bibliothèque pour la gestion du clavier en python
2 - Le python est multithread donc on peut lancer quelque chose et continuer la suite de la macro.
3 - Pour lancer l'envoi de touche avec un délai on peut utiliser en python un timer.

En résumé le principe :
Une instruction pour envoi de return au bout de x secondes suivi de l'instruction qui ouvre la fenêtre de dialogue. Comme elle est modale , l'envoi de touche lui arrive dedans normalement et donc on appuie sur le bouton OK.

Si cela t'intéresse dis le moi. Et si cela s'avère opérationnel, peut-être mettre le code dans le suprême de code.

Ami calmant, J.P
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04