[Résolu][Writer] Déconnecter les images liées

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 !
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 94
Inscription : 23 déc. 2012 18:42

[Résolu][Writer] Déconnecter les images liées

Message par touvenant »

Bonjour à tous (càd femme, enfants, hommes, autres, bref tous quoi...)
je cherche à déconnecter les images liées par macro, d'autant plus que la procédure manuelle "Édition>Liens externes" ne fonctionne pas très bien, il arrive qu'à la réouverture du document, certain liens réapparaissent, comme s'ils n'avaient pas été déconnectés...
Voici mon code :

Code : Tout sélectionner

Sub graphicUnLink
	Dim oDoc as object
	Dim oText as Object
	Dim oGraphics as object ' collecte toutes les images du document
	Dim oGraphic as Object ' pour chaque image
	Dim oCursor as Object ' pour le curseur auquel est ancré l'image
	Dim oNewGraphic as Object ' pour la nouvelle image
	Dim sURL as String ' pour stocker  l'URL de l'image liée
	Dim sAnchorType as String ' pour stocher le type d'ancrage de l'image liée
	
	oDoc = ThisComponent
	oText = oDoc.Text
	oGraphics = oDoc.GraphicObjects
	
	For i = 0 To oGraphics.Count - 1
	    oGraphic = oGraphics.getByIndex(i)
	    REM récupère l'URL de l'objet lié
	    sURL = oGraphic.graphic.OriginURL
	    REM récupère le type d'ancrage de l'objet lié
	    sAnchorType = oGraphic.AnchorType
	    REM récupère la position de l'objet lié
	    ...
	    REM insère un nouvel objet embarqué (i.e. il ne sera pas lié) depuis l'URL de l'objet lié
		oNewGraphic = oDoc.CreateInstance("com.sun.star.text.GraphicObject")
		oNewGraphic.GraphicURL = sURL
		oNewGraphic.AnchorType = sAnchorType
		oNewGraphic.Width = oGraphic.Size.Width
		oNewGraphic.Height = oGraphic.Height
		'oCursor = oText.createTextCursorByRange(oGraphic.Anchor.Start)
		'oText.insertTextContent(oCursor, oNewGraphic, True)
	Next i
End Sub
Mais, ça ne marche pas :
1) insertTextContent(), qu'il soit à False ou à True n'a aucun effet puisque l'image n'est pas du texte,
2) comme je ne peux pas "écraser" l'image linkée avec l'imagé embarquée, il me faudrait effacer l'image embarquée, mais je n'ai pas trouvé comment faire. Qui connaît le nom de la méthode à utiliser ?
3) le code insère l'image embarquée, à la même ancre que l'image linkée, avec le même type d'ancre, mais pas toujours à la même position par rapport à l'ancre... Qui saurait comment je pourrais récupérer la position de l'image et forcer cette position sur l'image insérée ?
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par touvenant le 07 janv. 2025 18:13, modifié 1 fois.
LibreOffice 25.8.3.2 (x86_64)
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26242
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Writer] Déconnecter les images liées

Message par Dude »

Salut,

Depuis "l'amélioration" de l'API, il y a plusieurs bogues qui sont apparues.
Discuté ici : viewtopic.php?p=318925#p318925
Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 94
Inscription : 23 déc. 2012 18:42

Re: [Writer] Déconnecter les images liées

Message par touvenant »

Bonjour Dude,
merci pour ta réponse.
J'étais tombé sur ce fil qui ne semble pas impacter mon problème :
Les rapports de bugs signalent 3 problèmes :
La propriété isLinked, booleen qui reste à "false" même lorsque l'image est liée (avec python)
La propriété originUrl, string qui reste vide même avec une image liée (avec python)
La méthode insertTextContent(GraphicObject) qui insère une image embarquée et non liée bien que GraphicURL ait reçu une URL valide.
Les deux premiers ont semblent-il été patchés en 2018 et intégré dans la version suivante.
Le troisième pour lequel une fonction a été proposée https://bugs.documentfoundation.org/sho ... ?id=119519.
Il se trouve je ne cherche pas à insérer des images liées mais embarquées (en fait je souhaite supprimer les liaisons et c'est le stratagème que j'ai utilisé : je lis l'URL de l'image liée, j'insère l'image (embarquée) depuis cette l'URL, et j'aimerai pouvoir supprimer l'image liée...) donc insertTextContent(GraphicObject) fonctionne.
OriginURL fonctionne (voir image jointe)
Mon problème essentiel est que je ne sais pas effacer l'image liée.
Mon problème secondaire, c'est la précision de la position de l'image à l'insertion.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 25.8.3.2 (x86_64)
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26242
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Writer] Déconnecter les images liées

Message par Dude »

touvenant a écrit : ↑03 janv. 2025 10:23 Il se trouve je ne cherche pas à insérer des images liées mais embarquées (en fait je souhaite supprimer les liaisons et c'est le stratagème que j'ai utilisé
Ton "stratagème" est un contournement infâme d'un manquement de l'API.
On ne peut plus sous LibO depuis la 6.1, intégrer les images qui sont liées.
touvenant a écrit : ↑03 janv. 2025 10:23 Mon problème essentiel est que je ne sais pas effacer l'image liée.
C'est donc ce titre qui aurait dû être mentionné.
Effacer une image se fait au niveau de la couche de dessin :

Code : Tout sélectionner

Sub Main
	oDoc = ThisComponent
	SupprImage(oDoc, "Image1")
End Sub

Function SupprImage(oDoc, sNom)
	oPage = oDoc.getDrawPage()
	For i = 0 To oPage.Count - 1
		oImg = oPage.getByIndex(i)
		if oImg.Name = sNom then oPage.remove(oImg)
	next
End function
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 94
Inscription : 23 déc. 2012 18:42

Re: [Writer] Déconnecter les images liées

Message par touvenant »

Hello Dude,
Ton "stratagème" est un contournement infâme d'un manquement de l'API.
:lol: :lol: :lol:
C'est parfaitement exact ! Mais j'ai rien trouvé d'autre.
On ne peut plus sous LibO depuis la 6.1, intégrer les images qui sont liées.
Il semblerait qu'une solution (que je n'ai pas testée, je n'en ai pas encore besoin pour le moment) ait été proposée ici :
https://bugs.documentfoundation.org/sho ... ?id=119519
C'est donc ce titre qui aurait dû être mentionné.
Non, non, "déconnecter les images liées" : telle est ma quête.
A présent, j'ai réussi à supprimer les images (code ci-dessous), il me reste le problème de positionnement dégueulasse...
De plus, ce code ne fonctionne pas lorsque les images se trouvent à l'intérieur d'un tableau, car la propriété Anchor de l'objet graphique n'est pas la même ! Je cherche anchor la solution...
La propriété "oGraphic.Position" semble provoquer une erreur d'après Xray (image jointe) quelqu'un saurait pourquoi ?

Code : Tout sélectionner

REM Déconnecter les liens de toutes les images liées ----------------------------------------------------------------------------------------------------------------------------
Sub graphicUnLink2
	Dim oDoc as object
	Dim oText as Object
	Dim oGraphics as object ' collecte toutes les images du document
	Dim oGraphic as Object ' pour chaque image
	Dim aGraphics(0, 7) as Variant
	Dim oCursor as Object ' pour le curseur auquel est ancré l'image
	Dim oNewGraphic as Object ' pour la nouvelle image
	Dim sURL as String ' pour stocker  l'URL de l'image liée
	Dim sAnchorType as String ' pour stocher le type d'ancrage de l'image liée
	
	oDrawPage = ThisComponent.DrawPages.getByIndex(0)
	oText = ThisComponent.Text
	
	REM récupère la collection d'image	
	oGraphics = ThisComponent.GraphicObjects
	iNbGraphics = oGraphics.Count
	Redim aGraphics(iNbGraphics, 7)

	REM Récupère chaque image de la collection et enregistre ses propriétés dans un array
	For i = 0 To iNbGraphics - 1
		oGraphic = oGraphics.getByIndex(i)
		bIsLinked = oGraphic.graphic.Linked
	    if bIsLinked Then
			REM enregistre limage en cours dans un tableau
			aGraphics(i, 0) = oGraphic.Name
			REM récupère l'URL de l'image liée et l'ajoute au tableau
			aGraphics(i, 1) = oGraphic.graphic.OriginURL
			REM récupère le type d'ancrage de l'image liée et l'ajoute au tableau
			aGraphics(i, 2) = oGraphic.AnchorType
			REM récupère la taille de l'image et l'ajoute au tableau
			aGraphics(i, 3) = oGraphic.Size.Width
			aGraphics(i, 4) = oGraphic.Size.Height
			REM récupère un curseur sur l'ancre de l'image liée et l'ajoute au tableau
			aGraphics(i, 5) = oText.createTextCursorByRange(oGraphic.Anchor.Start)
			REM récupère l'image l'image liée et l'ajoute au tableau
			aGraphics(i, 6) = FindObjectByName(oDrawPage, oGraphic.Name)
			REM récupère la position de l'image liée et l'ajoute au tableau
	Xray oGraphic
			aGraphics(i, 7) = oGraphic.Position
		End If
	Next i
	REM insère les nouvelles images embarquées (i.e. elles ne seront pas liées) depuis l'URL de chaque image liée
	For j = 0 To iNbGraphics - 1
		oEmbededGraphic = ThisComponent.createInstance("com.sun.star.text.TextGraphicObject")
		oEmbededGraphic.GraphicURL = aGraphics(j, 1)
		oEmbededGraphic.AnchorType = aGraphics(j, 2)
		oEmbededGraphic.Width = aGraphics(j, 3)
		oEmbededGraphic.Height = aGraphics(j, 4)
		'oEmbededGraphic.Position = aGraphics(j, 7)
		oText.insertTextContent(aGraphics(j, 5), oEmbededGraphic, True)
		REM supprime l'image liée
		ThisComponent.CurrentController.Select(aGraphics(j, 6))
		oDrawPage.remove(aGraphics(j, 6))
	Next j
End Sub


REM Chercher une image à partir de son nom
' Macro extraite de "l'API d'OOo (presque) sans peine (Bernard Marcelly)"
Function FindObjectByName(LaPage As Object, NomForme As String ) As Object
Dim formeX As Object
Dim f1 As Long
  For f1 = 0 To LaPage.Count - 1
    formeX = LaPage(f1)
    If formeX.Name = NomForme Then
      FindObjectByName = formeX
      Exit Function
    EndIf
  Next
rem ici la fonction retourne null
End Function
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par touvenant le 04 janv. 2025 08:21, modifié 1 fois.
LibreOffice 25.8.3.2 (x86_64)
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
Oukcha
RespOOnsable modération
RespOOnsable modération
Messages : 4371
Inscription : 06 oct. 2008 08:03

Re: [Writer] Déconnecter les images liées

Message par Oukcha »

Bonjour,
touvenant a écrit : ↑03 janv. 2025 23:48 j'ai réussi à supprimer les images
Le présent sujet est donc à baliser avec Image[Résolu].
touvenant a écrit : ↑03 janv. 2025 23:48 il me reste le problème de positionnement
Un nouveau sujet serait probablement bienvenu.

Cordialement
                                        
Pour tout savoir sur le fonctionnement de ce forum :arrow: À lire avant tout ! Image
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 94
Inscription : 23 déc. 2012 18:42

Re: [Writer] Déconnecter les images liées

Message par touvenant »

Bonjour Ouchka,
Le présent sujet est donc à baliser avec Image[Résolu].
Non, le sujet est "Déconnecter les images liées"
Un nouveau sujet serait probablement bienvenu.
Le positionnement est un problème inhérent à mon approche (infâme) de déconnecter les images liées.
Je m'y prends probablement très mal, mais il semblerait que personne n'ait d'autre solution... mais si autre solution il y a, le problème du positionnement s'achèvera avec le sujet "Déconnecter les images liées".
LibreOffice 25.8.3.2 (x86_64)
Windows10 Pro v10.0.19044
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26242
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Writer] Déconnecter les images liées

Message par Dude »

A priori, l'usage du service GraphicProvider permet la rupture des liens.

Code : Tout sélectionner

Sub Main
	oDoc = ThisComponent
	ImageIntegre(oDoc, "Image1")

End Sub

Function ImageIntegre(oDoc, sNom)
	'fonction originale issue de zBasic 3.1 : zImage.Integre
	'https://beaussier.com/sections/viewtopic.php?t=1612
	oPage = oDoc.getDrawPage()
	sType = "com.sun.star.drawing.GraphicObjectShape"
	sServ = "com.sun.star.graphic.GraphicProvider"
	dim props(1) as new com.sun.star.beans.PropertyValue

	for i = 0 to oPage.Count -1
		oForme = oPage.getByIndex(i)
		if oForme.supportsService(sType) then
			if oForme.Name = sNom then exit for
		endif
	next
	sURL = oForme.Graphic.OriginURL
	oGP = createUnoService(sServ)
	props(0).Name = "URL"
	props(0).Value = sURL
	props(1).Name = "LoadAsLink"
	props(1).Value = False
	oForme.Graphic = oGP.queryGraphic(props())
End function
Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues
touvenant
Membre OOrganisé
Membre OOrganisé
Messages : 94
Inscription : 23 déc. 2012 18:42

Re: [Writer] Déconnecter les images liées

Message par touvenant »

Mille merci Dude !
GraphicProvider... j'étais passé à côté.

Du coup, voici le code qui déconnecte les images liées :

Code : Tout sélectionner

Sub AllGraphicsUnlink
	'fonction originale issue de zBasic 3.1 : zImage.Integre
	'https://beaussier.com/sections/viewtopic.php?t=1612
	oPage = ThisComponent.getDrawPage()
	sType = "com.sun.star.drawing.GraphicObjectShape"
	sServ = "com.sun.star.graphic.GraphicProvider"
	dim props(1) as new com.sun.star.beans.PropertyValue

	for i = 0 to oPage.Count -1
		oForme = oPage.getByIndex(i)
		sURL = oForme.Graphic.OriginURL
		oGP = createUnoService(sServ)
		props(0).Name = "URL"
		props(0).Value = sURL
		props(1).Name = "LoadAsLink"
		props(1).Value = False
		oForme.Graphic = oGP.queryGraphic(props())
	next
End Sub
Merci également à Beaussier.
Problème résolu
LibreOffice 25.8.3.2 (x86_64)
Windows10 Pro v10.0.19044