[Résolu][Java] Insertion image dans un cadre ou tableau au milieu d'une chaîne de caractère

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 !
tomatoes
Membre OOrganisé
Membre OOrganisé
Messages : 70
Inscription : 31 mai 2010 11:58

[Résolu][Java] Insertion image dans un cadre ou tableau au milieu d'une chaîne de caractère

Message par tomatoes »

Bonjour,

J'arrive à ajouter une image dans un document normal (c'est à dire sans tableau, sans cadre)
J'arrive à ajouter une image dans un tableau si il n'y a pas de texte dans la cellule (il y a seulement l'image)
Par contre je n'arrive pas à ajouter une image au milieu d'une chaine de caractère dans la cellule d'un tableau et même problème dans un cadre (document qui est une planche d'étiquette). Et j'ai besoin de faire cela pour intercaler une image au milieu d'une String

Je n'ai aucune erreur le XTextCursor semble bien positionné du coup je pense
J'ai fais pas mal d'essais sur les propriétés "AnchorType" et "TextWrap" mais rien je ne vois pas mon image sur le document

Merci grandement pour votre aide

Bonne journée
Dernière modification par tomatoes le 20 févr. 2023 18:14, modifié 8 fois.
Libre office 24.2.6 sous Windows 10
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 9580
Inscription : 28 août 2010 08:45

Re: [JAVA] Insertion image dans un cadre ou tableau au milieu d'une String

Message par micmac »

Bonjour,

Merci de joindre votre code.
Touche Ctrl de Windows = touche cmd⌘ sur Mac
Outils > Options sur Windows = OpenOffice > Préférences sur macOS
tomatoes
Membre OOrganisé
Membre OOrganisé
Messages : 70
Inscription : 31 mai 2010 11:58

[Java] Insertion image dans un cadre ou tableau au milieu d'une chaîne de caractère

Message par tomatoes »

Voici

merci :D

Code : Tout sélectionner



public void testAjoutImagePrecisDansTableauOuCadre(  ) {
		String template = "<IMAGE_ICI>";
		
	if (isConnected()) {
	try {
		synchronized (getConnector()) {
			_xtextdocument = (XTextDocument) UnoRuntime.queryInterface( XTextDocument.class, _xcomponent );
					
				if (_xtextdocument != null) {
					Object[]o=goTo( template );
					XTextCursor textCursor = (XTextCursor) o[1];
					XTextRange xTextRange = (XTextRange) o[0];
						
					try {
						XMultiServiceFactory xMSF = (XMultiServiceFactory) UnoRuntime.queryInterface( MultiServiceFactory.class,
								_xtextdocument );

						XTextContent xImage = (XTextContent) UnoRuntime.queryInterface( XTextContent.class,
								xMSF.createInstance( "com.sun.star.text.TextGraphicObject" ) );

						XPropertySet xProps = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, xImage );
						xProps.setPropertyValue( "GraphicURL", "file:///C:/toto.jpg");								
						xProps.setPropertyValue( "Print", true );
						xProps.setPropertyValue( "Width", (int) 300);// Largeur de l'image
						xProps.setPropertyValue( "Height", (int) 300);// Hauteur de l'image
						xProps.setPropertyValue( "AnchorType", com.sun.star.text.TextContentAnchorType.AS_CHARACTER );
						xProps.setPropertyValue( "TextWrap", com.sun.star.text.WrapTextMode.THROUGHT );
						xProps.setPropertyValue( "Opaque", false ); // En arrière plan
							
						textCursor.getText().insertTextContent( textCursor, xImage, false );
					} catch (Exception e) {

					}													

					}
				}
			} catch (Exception ex) {
				isc.util.log.LogUtil.getLogger().error( "Erreur", ex );
			}
		}
	}
	
	// Renvoi un XTextRange et un XTextCursor à l'endroit où on trouve la balise champ
	public Object[] goTo( String champ) {
		
		XTextRange xTextRange = null;
		XTextCursor textCursor = null;

		if (isConnected() && champ != null) {
			try {
			synchronized (getConnector()) {
				xReplaceable = (XReplaceable) UnoRuntime.queryInterface( XReplaceable.class, _xcomponent );
				_xtextdocument = (XTextDocument) UnoRuntime.queryInterface( XTextDocument.class, _xcomponent );
					
				_xText = _xtextdocument.getText();
				textCursor = _xText.createTextCursor();

				XSearchDescriptor search = xReplaceable.createSearchDescriptor();
				search.setSearchString( champ );
				xTextRange = (XTextRange) UnoRuntime.queryInterface( XTextRange.class, xReplaceable.findFirst( search ) );
				}
			} catch (Exception ex) {
				isc.util.log.LogUtil.getLogger().error( "Erreur", ex );
			}
		}
		return new Object[] { xTextRange, textCursor };
	}



Dernière modification par tomatoes le 17 févr. 2023 21:23, modifié 1 fois.
Libre office 24.2.6 sous Windows 10
Avatar de l’utilisateur
Dolev
SuppOOrter
SuppOOrter
Messages : 1047
Inscription : 19 août 2018 05:20

Re: [Writer][Java] Insertion image dans un cadre ou tableau au milieu d'une chaîne de caractère

Message par Dolev »

Bonsoir,

Joindre un fichier permet aussi de ne pas avoir à créer de toute pièce quelque chose qui n'irait pas.

Un passage par la recherche sur le forum et le suprême de code :
viewtopic.php?t=6357
Open Office 4.1.15 sous Windows 11
Avatar de l’utilisateur
Oukcha
RespOOnsable modération
RespOOnsable modération
Messages : 4117
Inscription : 06 oct. 2008 08:03

Re: [Writer][Java] Insertion image dans un cadre ou tableau au milieu d'une chaîne de caractère

Message par Oukcha »

La balise [Writer] est réservée à du développement en Basic, comme tel n'est pas le cas, balise supprimé,

Cordialement
                                        
Pour tout savoir sur le fonctionnement de ce forum :arrow: À lire avant tout ! Image
tomatoes
Membre OOrganisé
Membre OOrganisé
Messages : 70
Inscription : 31 mai 2010 11:58

Re: [Java] Insertion image dans un cadre ou tableau au milieu d'une chaîne de caractère

Message par tomatoes »

Avant de poster j'ai bien sûr cherché sur le forum (je connais cette page), j'ai cherché sur Internet, j'ai lu le livre de programmation et j'ai plusieurs jours de tests non concluants.

Voici le fichier que j'utilise pour les tests je cherche à insérer par exemple une image au niveau de <PROD1>, c'est une planche d'étiquette

Même problème si à l a place des cadres j'ai un tableau

Cordialement
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre office 24.2.6 sous Windows 10
Avatar de l’utilisateur
Dolev
SuppOOrter
SuppOOrter
Messages : 1047
Inscription : 19 août 2018 05:20

Re: [Java] Insertion image dans un cadre ou tableau au milieu d'une chaîne de caractère

Message par Dolev »

tomatoes a écrit : 17 févr. 2023 21:22 Avant de poster j'ai bien sûr cherché sur le forum (je connais cette page)
Ce n'est pas indiqué dans votre premier message.

En Basic...

Code : Tout sélectionner

Sub Main
	sURL = "c:\temp\logo.png"
	ImageDansCadre("Cadre1", sURL) 
End Sub

Sub ImageDansCadre(nomCadre, nomFichier)
	sURL = convertToURL(nomFichier)
	if not FileExists(sURL) then exit sub	
	oDoc = thisComponent
	oCadre = oDoc.getTextFrames.getByName(nomCadre)
	oTexte = oCadre.text
	oCurseur = oTexte.createTextCursor
	oImage = oDoc.createInstance("com.sun.star.text.GraphicObject")
	With oImage
		.GraphicURL = sURL
		.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
		.Width = 2560
		.Height = 2560
	End With
   	oTexte.InsertTextContent(oCurseur, oImage, False)   	
End Sub

Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Open Office 4.1.15 sous Windows 11
tomatoes
Membre OOrganisé
Membre OOrganisé
Messages : 70
Inscription : 31 mai 2010 11:58

Re: [Java] Insertion image dans un cadre ou tableau au milieu d'une chaîne de caractère

Message par tomatoes »

merci déja pour ce code basic :D j'essaye de le convertir en Java mais pour l'instant cela ne fonctionne pas... je continue mes tests voici où j'en suis peut être que je fais fausse route. J'ai nommé dans ma planche d'étiquette mes cadres de Cadre1 à Cadre14

Code : Tout sélectionner

XComponentContext xComponentContext = getConnector().getXComponentContext();
XMultiComponentFactory xmcf = getConnector().getXMultiComponentFactory();
Object desktop = xmcf.createInstanceWithContext( "com.sun.star.frame.Desktop", xComponentContext );
com.sun.star.frame.XDesktop xDesktop = (com.sun.star.frame.XDesktop) UnoRuntime
								.queryInterface( com.sun.star.frame.XDesktop.class, desktop );
XFramesSupplier xTablesSupplier = (XFramesSupplier) UnoRuntime.queryInterface( XFramesSupplier.class, desktop );
XFrames xNamedTables = xTablesSupplier.getFrames();
XFrame[] t = xNamedTables.queryFrames( 55 );
XFrame f = t[0].findFrame( "Cadre1", 55 );
Libre office 24.2.6 sous Windows 10
tomatoes
Membre OOrganisé
Membre OOrganisé
Messages : 70
Inscription : 31 mai 2010 11:58

Re: [Java] Insertion image dans un cadre ou tableau au milieu d'une chaîne de caractère

Message par tomatoes »

j'y arrive toujours pas, c'est quoi l'équivalent du getTextFrames en Java ?
Libre office 24.2.6 sous Windows 10
tomatoes
Membre OOrganisé
Membre OOrganisé
Messages : 70
Inscription : 31 mai 2010 11:58

Re: [Java] Insertion image dans un cadre ou tableau au milieu d'une chaîne de caractère

Message par tomatoes »

j'avance enfin
j'arrive à avoir un XTextFramesSupplier XTextFramesSupplier xtFrameSupplier
ensuite je fais un xtFrameSupplier.getTextFrames().getByName( "Cadre1" );
cela semble bien mes cadres car jusqu'à Cadre14 j'ai un objet mais pas Cadre15
j'ai un objet de type Any mais c'est quoi précisément comme type d'objet

La modération vous a écrit: :alerte: Merci de ne pas poster plusieurs messages à la suite !
Tant que vous n'avez pas reçu de nouvelle réponse, cela ne sert à rien et votre monologue rallonge inutilement la lecture du fil de discussion.
Si vous devez ajouter un complément d'information, le bouton "Modifié" (petit crayon) à la droite du message permet d'y remédier.

En attendant une prochaine réponse, vous pouvez participer également en répondant à d'autres questions sur notre forum.

Libre office 24.2.6 sous Windows 10
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 639
Inscription : 09 août 2017 22:15

Re: [Java] Insertion image dans un cadre ou tableau au milieu d'une chaîne de caractère

Message par Jurassic Pork »

Hello,
tomatoes a écrit : 20 févr. 2023 14:12 j'arrive à avoir un XTextFramesSupplier XTextFramesSupplier xtFrameSupplier
ensuite je fais un xtFrameSupplier.getTextFrames().getByName( "Cadre1" );
cela semble bien mes cadres car jusqu'à Cadre14 j'ai un objet mais pas Cadre15
j'ai un objet de type Any mais c'est quoi précisément comme type d'objet
Avec les cadres du document ott que tu as mis en pièce jointe ? Ils semblent tous du même type.
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
tomatoes
Membre OOrganisé
Membre OOrganisé
Messages : 70
Inscription : 31 mai 2010 11:58

[Résolu][Java] Insertion image dans un cadre ou tableau au milieu d'une chaîne de caractère

Message par tomatoes »

oui c'est le fichier d'origine voici le nouveau
Désolé pour le monologue

Voici le code Java qui fonctionne

Code : Tout sélectionner


try {
	synchronized (getConnector()) {
		xReplaceable = (XReplaceable) UnoRuntime.queryInterface( XReplaceable.class, _xcomponent );

		_xtextdocument = _xcomponent != null ? (XTextDocument) UnoRuntime.queryInterface( XTextDocument.class, _xcomponent ) : null;

		if (_xtextdocument != null) {

			XTextFramesSupplier xtFrameSupplier = (XTextFramesSupplier) UnoRuntime.queryInterface( XTextFramesSupplier.class,
								_xcomponent );

			XTextFrame xtf = (XTextFrame) UnoRuntime.queryInterface( XTextFrame.class,
								xtFrameSupplier.getTextFrames().getByName( nomCadre ) );

			xReplaceable = (XReplaceable) UnoRuntime.queryInterface( XReplaceable.class, _xcomponent );

			XSearchDescriptor search = xReplaceable.createSearchDescriptor();
			search.setSearchString( template );

			XTextRange xTextRange = (XTextRange) UnoRuntime.queryInterface( XTextRange.class, xReplaceable.findFirst( search ) );

			if (xTextRange != null) {
			XMultiServiceFactory xMSF = (XMultiServiceFactory) UnoRuntime.queryInterface( XMultiServiceFactory.class,
									_xtextdocument );

			XTextContent xImage = (XTextContent) UnoRuntime.queryInterface( XTextContent.class,
									xMSF.createInstance( "com.sun.star.text.TextGraphicObject" ) );

			XPropertySet xProps = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, xImage );
			xProps.setPropertyValue( "GraphicURL", adresseFile );// Détermine l'URL concernant l'image (Format: file:///C:/temp/image.gif)
			xProps.setPropertyValue( "Print", true );// Détermine si l'objet sera imprimé aussi lors de l'impression du doc.
			xProps.setPropertyValue( "Width", (int) width );// Largeur de l'image
			xProps.setPropertyValue( "Height", (int) height );// Hauteur de l'image
			xProps.setPropertyValue( "AnchorType", com.sun.star.text.TextContentAnchorType.AS_CHARACTER );// Détermine l'ancrage à la page
			xProps.setPropertyValue( "TextWrap", com.sun.star.text.WrapTextMode.THROUGHT );// Sans adaptation du texte pour l'image
			xProps.setPropertyValue( "Opaque", false ); // En arrière plan

			xtf.getText().insertTextContent( xTextRange, xImage, false );
						}
					}
				}
			} catch (Exception ex) {
				isc.util.log.LogUtil.getLogger().error( "Erreur", ex );
			}

Merci pour votre aide
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre office 24.2.6 sous Windows 10