[RESUELTO] Macro para insertar imágenes a partir de un texto

Discute sobre el procesador de textos
Responder
Avatar de Usuario
daniel21805
Mensajes: 21
Registrado: Sab Abr 04, 2015 9:21 pm
Ubicación: Manizales, Colombia

[RESUELTO] Macro para insertar imágenes a partir de un texto

Mensaje por daniel21805 »

Cordial saludo

Quiero explicarles un poco sobre mi consulta, resulta que estoy trabajando en elaboración de catálogos (estos catálogos contienen imágenes). Sin embargo, no todos los clientes están interesados en todos los productos (además que tener un catálogo con todas las imágenes de los productos haría que el documento writer sea demasiado pesado para enviarlo por correo); otro factor es que cada cliente tiene intereses diferentes y por lo tanto cada catálogo tiene que ser elaborado (manualmente) a solicitud del cliente (ya se imaginarán la cantidad de trabajo que se requiere para crear catálogos distintos por cada cliente). Una idea que se me ocurrió es crear una base de datos (en Access) con las preferencias de cada cliente y generar una plantilla con códigos (estos códigos realmente son "textos" palabras que hacen referencia a una imagen):

Ejm:
Cliente N1 - Hotel de preferencia: ABC123
- Restaurante de preferencia: DEF345
- Transporte de preferencia: GHI678

Ahora lo que quiero es que al pasar la información a Writer el programa (o sea Writer) me reemplace el código "ABC123" (y los demás códigos) por las imágenes guardadas en mi servidor y que a la vez puedan ser asociadas a dichos códigos de modo que cuando genere otro documento las imágenes puedan ser llamadas al documento cuando el código esté presente en el mismo ¿Es eso posible? (de esta forma creo que podría lograr mi objetivo que es tener un catálogo personalizado por cliente)

Muchísimas gracias
Última edición por daniel21805 el Vie Mar 12, 2021 8:29 pm, editado 1 vez en total.
Daniel
LibreOffice Versión 6.4.5.2 (x64)
Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Insertar imágenes automáticamente a partir de un texto

Mensaje por Longi »

Buenas!
Sería cuestión de tunear un informe para meter las imágenes que tengas guardada en una carpeta.
No es imposible (hay ejemplos en el foro), aunque tampoco es trivial.
Con un ejemplo podríamos mirar algo.
Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
daniel21805
Mensajes: 21
Registrado: Sab Abr 04, 2015 9:21 pm
Ubicación: Manizales, Colombia

Re: Insertar imágenes automáticamente a partir de un texto

Mensaje por daniel21805 »

Muchas gracias por tu respuesta Longi

Realmente no es nada del otro mundo. Adjunto envío dos documentos de texto a modo de "modelos", cada documento es para un cliente diferente (A & B, aunque en la vida real hay muchos más); en el ejemplo el cliente A tiene preferencia por playa 1 & 3 y el cliente B tiene preferencia por playas 2, 4 & 5. Obviamente las imágenes del ejemplo adjunto no son los productos que realmente se ofrecen al cliente, estas imágenes estarían alojadas en un servidor y la idea es que el documento de texto las llame con solo la presencia del código (que en este caso son las palabras: PLAYA1, PLAYA2, PLAYA3, PLAYA4, PLAYA5 escritas en color rojo). Quisiera saber si habría alguna manera o un comando que reemplace las palabras clave (o sea PLAYA1, PLAYA2, PLAYA3, PLAYA4, PLAYA5) por las imágenes correspondientes; en word hay un truco que involucra el autocorrector, esto funcionaría siempre y cuando yo digite las palabras clave de manera manual, sin embargo al ser un documento que se genera de una base de datos este truco no satisface mis necesidades puesto que para que el texto se reemplace por imágenes tengo que darle "Enter" a cada palabra de manera manual y eso es una pérdida de tiempo para mi considerando que cada documento puede tener hasta 50 imágenes.

Mil gracias de antemano, quedo atento a tus comentarios.
Saludos

Link de descarga: https://drive.google.com/file/d/1ZPWaLt ... sp=sharing
Daniel
LibreOffice Versión 6.4.5.2 (x64)
Windows 10
Avatar de Usuario
daniel21805
Mensajes: 21
Registrado: Sab Abr 04, 2015 9:21 pm
Ubicación: Manizales, Colombia

Re: Insertar imágenes automáticamente a partir de un texto

Mensaje por daniel21805 »

Siguiendo con mi búsqueda, encontré una macro (hecha para funcionar en Microsoft Word) que en "teoría" debería funcionar, sé que esto no tiene nada que ver con Writer, sin embargo cuando pruebo la macro en Word veo que el parámetro "sMarkerText = "(image??.jpg)" no funciona cuando está con los comodines "??" (lo cual según lo que entiendo debería buscar todos los textos dentro de paréntesis que empiecen con "image" y luego 2 dígitos que podrían ser 01, 02, etc y que tengan la extensión ".jpg") sólamente funciona cuando está sin ellos, es decir: "sMarkerText = "(image01.jpg)". ¿Podrían tener una idea de cómo podría funcionar en Writer esta macro?

Sub ReplaceImages()
Dim sMarkerText As String
Dim sFigName As String
Dim sFigPath As String

' Change to the path to the pictures, with a trailing slash.
sFigPath = "C:\Users\DANIEL\Desktop\Nueva carpeta (3)\"

' Change to marker text. Can include wildcards.
sMarkerText = "(image??.jpg)"

' Search through document for marker text
Selection.Find.ClearFormatting
With Selection.Find
.Text = sMarkerText
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute
While Selection.Find.Found
' Found a match, so grab name
' Need to adjust for parens in marker text
sFigName = Mid(Selection, 2, Len(Selection) - 2)

' Delete the marker text
Selection.Delete

' Insert the picture
Selection.InlineShapes.AddPicture FileName:= _
sFigPath & sFigName, LinkToFile:=False, _
SaveWithDocument:=True
Selection.Find.Execute
Wend
End Sub

El link de donde obtuve esta macro es: https://wordribbon.tips.net/T010135_Rep ... Image.html

Agradecería su apoyo. Mil gracias de antemano
Daniel
LibreOffice Versión 6.4.5.2 (x64)
Windows 10
FJCC-ES
Mensajes: 873
Registrado: Mié Mar 25, 2009 1:19 am
Ubicación: Colorado, USA

Re: Insertar imágenes automáticamente a partir de un texto

Mensaje por FJCC-ES »

Creé un estilo de párrafo con el nombre Imagen. Es casi idéntico al estilo Predeterminado solamente con Alineación = Centrado. Cambié el estilo de los párrafos con el texto PLAYA1, PLAYA2, etc. a el estilo Imagen.
Esta macro busca cada texto con el estilo Imagen y lo reemplaza con la imagen con el mismo nombre.

Código: Seleccionar todo

Sub Main
SDescrip = ThisComponent.createSearchDescriptor()
SDescrip.SearchStyles = TRUE
SDescrip.SearchString = "Imagen"
Imagenes = ThisComponent.findAll(SDescrip)
Count = Imagenes.Count
oTextDoc = ThisComponent.Text
for i = 0 to Count - 1
  oTexto = Imagenes.getByIndex(i)
  NombreImagen = oTexto.String
  oTexto.String = ""
  Url = convertToURL("/home/fjcc/Downloads/EJEMPLOS/IMAGENES/" & NombreImagen & ".PNG")
  objTextGraphicObject = ThisComponent.createInstance("com.sun.star.text.TextGraphicObject")
  objTextGraphicObject.GraphicURL = Url 
  objTextGraphicObject.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
  Size = objTextGraphicObject.Size
  
  Size.Height = 13000 #Altura de la imagen
  Size.Width = 16000  #Ancho de la imagen
  objTextGraphicObject.Size = Size
  oTextDoc.insertTextContent(oTexto.Start, objTextGraphicObject, false)
next i
End Sub
El archivo adjunto contiene la macro. Antes de probarla, tiene que cambiar la dirección /home/fjcc/Downloads/EJEMPLOS/IMAGNES a la carpeta que contiene las imágenes en su ordenador.
Puede guardar la macro en la biblioteca Mis macros para usarla con cualquier archivo.
Sugiero que guarda una plantilla con el estilo Imagen y usa esa plantilla para sus documentos para tener el estilo siempre a mano.
Adjuntos
CLIENTE B.odt
(12.86 KiB) Descargado 275 veces
Avatar de Usuario
daniel21805
Mensajes: 21
Registrado: Sab Abr 04, 2015 9:21 pm
Ubicación: Manizales, Colombia

Re: Insertar imágenes automáticamente a partir de un texto

Mensaje por daniel21805 »

Cordial saludo FJCC-ES

Acabo de probar la macro y funciona, cumple su objetivo y es fantástico, mil gracias. Sólo quería pedirle un favor más, es que en el banco de imágenes con el que pienso trabajar las imágenes ya tienen definidos el ancho y el alto (algunas son rectangulares y otras son cuadradas) sin embargo la Macro ajusta el tamaño independientemente del tamaño original, por lo que quisiera saber 1) Como primera alternativa ¿Podría indicarme otra configuración para que el ancho y largo de la imagen se autoajusten (y que siga siendo rectangular o cuadrado) dependiendo del ancho de la hoja? (un estilo tipo "RESPONSIVE") y.... Como opción en caso de que lo anterior no sea posible 2) ¿Qué debo modificar para que la imagen no pase por el reajuste de la macro sino que la macro la coloque con sus tamaños originales?

Por último, agradecería una explicación acerca del "estilo" que menciona en su comentario, la verdad no logro comprender bien el asunto del "estilo". Intenté aplicar la macro en otro documento con extensión ".rtf" (texto enriquecido) y no me funcionó por ahora solo está funcionando en el documento que usted me envió previamente (el cual tiene extensión ".odt").

Muchas gracias por su ayuda
Saludos
Daniel
LibreOffice Versión 6.4.5.2 (x64)
Windows 10
FJCC-ES
Mensajes: 873
Registrado: Mié Mar 25, 2009 1:19 am
Ubicación: Colorado, USA

Re: Insertar imágenes automáticamente a partir de un texto

Mensaje por FJCC-ES »

Es esta versión de la macro, los nombres de los imágenes están en marcos (menú Insertar -> Marco) cuyo tamaño es 100% del ancho de la página y la altura se ajusta automáticamente al tamaño del imagen, manteniendo las proporciones.

Código: Seleccionar todo

Sub Main
oMarcos = ThisComponent.TextFrames
Count = oMarcos.Count
for i = 0 to Count - 1
  oMarco = oMarcos.getbyIndex(i)
  oText = oMarco.Text
  oCurs = oText.createTextCursor()
  Imagen = oMarco.String
  oMarco.String = ""
  Url = convertToURL("/home/fjcc/Desktop/EJEMPLOS/IMAGENES/" & Imagen & ".PNG")
 
  objTextGraphicObject = ThisComponent.createInstance("com.sun.star.text.TextGraphicObject")
  objTextGraphicObject.GraphicURL = Url 
  objTextGraphicObject.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
  oText.insertTextContent(oCurs.Start, objTextGraphicObject, false)
next i
End Sub
Adjuntos
CLIENTE B.odt
(13.18 KiB) Descargado 254 veces
Avatar de Usuario
daniel21805
Mensajes: 21
Registrado: Sab Abr 04, 2015 9:21 pm
Ubicación: Manizales, Colombia

Re: Insertar imágenes automáticamente a partir de un texto

Mensaje por daniel21805 »

Hola nuevamente FJCC-ES

Agradezco su apoyo en esta inquietud que tuve. Ya leí en el foro acerca de los "estilos" de párrafo y me queda claro que para que la macro funcione el documento debe tener primeramente configurado el estilo "imagen" y posteriormente los párrafos donde se encuentran los textos "PLAYA01", "PLAYA02", etc. también deben estar con ese tipo de estilo (por esa razón es que no estaba funcionando la macro con el otro documento). Sólo tengo 2 puntos por comentar:

1) Lamentablemente no puedo tomar este método debido a que aplicar el estilo "imagen" de manera manual a todos los textos "PLAYA01", "PLAYA02", etc. implicaría una inversión de "tiempo", que precisamente es lo que se quiere ahorrar mediante una macro, y más teniendo en cuenta que los documentos enviados a los clientes siempre son diferentes me tocaría hacer este paso previo constantemente.

2) ¿Habría alguna manera de aplicar la macro sin tener que depender del estilo que tenga el párrafo (por lo general siempre será "Estilo predeterminado")?

Muchas gracias
Daniel
LibreOffice Versión 6.4.5.2 (x64)
Windows 10
FJCC-ES
Mensajes: 873
Registrado: Mié Mar 25, 2009 1:19 am
Ubicación: Colorado, USA

Re: Insertar imágenes automáticamente a partir de un texto

Mensaje por FJCC-ES »

La secunda versión de la macro no usa el estilo del párrafo para encontrar los nombres de las imágenes. Simplemente va de un marco al próximo. Este método supone que no hay otros marcos en el documento.
Avatar de Usuario
daniel21805
Mensajes: 21
Registrado: Sab Abr 04, 2015 9:21 pm
Ubicación: Manizales, Colombia

Re: Insertar imágenes automáticamente a partir de un texto

Mensaje por daniel21805 »

Hola FJCC-ES

Quiero agradecer primeramente el tiempo que se toma para dar respuestas a mis dudas. También aprovecho para comentarle que he probado la macro del segundo documento enviado por usted en comentarios anteriores y veo que existe un pequeño error al momento de cargar las imágenes las cuales están mostrándose mucho más pequeñas (ver imagen)

Imagen

Sin embargo no se preocupe, realmente agradezco su ayuda, lo que pasa es que en esta segunda macro ocurriría lo mismo que en la primera, las palabras tendrían que estar dentro de un marco, y desafortunadamente no las puedo sacar así desde otro programa (es decir con el estilo: "Marco"). La opción más interesante para mí fue la propuesta No1 con la primera macro que usted envió, sería genial si tan solo se pudiera hacer el proceso de sustitución de texto sin depender de un estilo de párrafo, es decir, que sólo se hiciera el reemplazo con una macro que identifique el texto (ejemplo: identifica todas las palabras que tengan PLAYA?? y dos dígitos adicionales) de esa manera sería más funcional para mí. Otra opción que vi en mis búsquedas fue que en lugar de colocar una palabra algunos programadores colocaban la ruta de la imagen dentro del documento de texto (algo así como una URL sin embargo esta no estaba linkeada a ninguna parte sólo era un "texto") y luego la macro lo que hacía era hacer "match" reemplazando la ruta por la imagen correspondiente, en fin son sólo ideas. Si usted tiene otras ideas que me pueda sugerir se lo agradecería de corazón.

Lo otro que se me ocurre es una "Macro" que le coloque el estilo "imagen" a todas líneas (párrafos) donde estén las palabras "PLAYA" (sé que suena arriesgado porque playa es una palabra común, sin embargo en un caso real la palabra a buscar podría ser una combinación alfanumérica). ¿Qué opina, es posible hacer eso?

Muchas gracias
Saludos
Daniel
LibreOffice Versión 6.4.5.2 (x64)
Windows 10
FJCC-ES
Mensajes: 873
Registrado: Mié Mar 25, 2009 1:19 am
Ubicación: Colorado, USA

Re: Insertar imágenes automáticamente a partir de un texto

Mensaje por FJCC-ES »

En esta versión, la macro busca texto que empieza con !!. El texto después de !! debe ser el nombre de la imagen.

Código: Seleccionar todo

Sub BuscarImagen
SDescrip = ThisComponent.createSearchDescriptor()
SDescrip.SearchRegularExpression = TRUE
SDescrip.SearchString = "!!.+$"

Frame   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(3) as new com.sun.star.beans.PropertyValue
args1(0).Name = "FileName"
'args1(0).Value = ""
args1(1).Name = "FilterName"
args1(1).Value = "<Todos los formatos>"
args1(2).Name = "AsLink"
args1(2).Value = false
args1(3).Name = "Style"
args1(3).Value = "Imágenes"

oVC = ThisComponent.CurrentController.ViewCursor

Imagenes = ThisComponent.findAll(SDescrip)
Count = Imagenes.Count

for i = 0 to Count - 1
  oTexto = Imagenes.getByIndex(i)
  oVC.gotoRange(oTexto.Start, False)
  NumCarac = Len(oTexto.String)
  NombreImagen = Right(oTexto.String, NumCarac - 2)
  oTexto.String = ""
  args1(0).Value = convertToURL("/home/fjcc/Desktop/EJEMPLOS/IMAGENES/" & NombreImagen & ".PNG")
  
  dispatcher.executeDispatch(Frame, ".uno:InsertGraphic", "", 0, args1())
  oVC.jumpToStartOfPage()

next i
End Sub
Adjuntos
CLIENTE B.odt
(13.54 KiB) Descargado 282 veces
Avatar de Usuario
daniel21805
Mensajes: 21
Registrado: Sab Abr 04, 2015 9:21 pm
Ubicación: Manizales, Colombia

Re: Insertar imágenes automáticamente a partir de un texto

Mensaje por daniel21805 »

Hola FJCC-ES

Muchísimas gracias por la macro, esta versión está perfecta.

Saludos
Daniel
LibreOffice Versión 6.4.5.2 (x64)
Windows 10
Responder