Buenas, en referencia al camino que segí para dar solución a mi requerimiento, que era generar formularios adjuntando información de una hoja usando la plantilla de otra y añadiendo una foto almacenada en el disco, lo que hice fue lo siguiente:
Generé cuatro funciones: una que me incluyera los datos de una hoja en la casilla de la plantilla de la otra, otra que me insertara la imagen guardada en el disco, otra que me eliminara la imagen insertada anterior y la ultima que me guardara la plantilla en PDF.
Os dejo el código por si a alguien le pudiera interesar. Comentar que mi trabajo consistía en el inventario de arbolado, cogiendo las características fitosanitarias de cada árbol, en total fueron 643, cada una con su foto.
Sub GenerarPDFs_v1()
Dim oDoc As Object
Dim oSheetArboles As Object
Dim oSheetPlantilla As Object
Dim oCell As Object
Dim oDispatcher As Object
Dim i As Long, LastRow As Long
Dim directorioFotos As String
Dim archivoFoto As String
Dim nombrePDF As String
Dim idArbol As String
Dim rutaPDF As String
' Ruta del directorio de fotos
directorioFotos = "C:\Users\...INSERTAR LA RUTA DONDE ESTÁN LAS FOTOS"
' Abrir el documento actual
oDoc = ThisComponent
oSheetArboles = oDoc.Sheets.getByName("Inventario")
oSheetPlantilla = oDoc.Sheets.getByName("Informe")
oDoc.CurrentController.setActiveSheet(oSheetPlantilla)
' Determinar la última fila con datos
LastRow = oSheetArboles.getRows().getCount() - 1
While IsEmpty(oSheetArboles.getCellByPosition(0, LastRow).String) And LastRow > 0
LastRow = LastRow - 1
Wend
' Crear el Dispatcher para operaciones de copiar/pegar
oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
' Iterar por cada fila con datos
For i = 1 To LastRow
' Leer los datos desde Hoja1
idArbol = oSheetArboles.getCellByPosition(1, i).String
oSheetPlantilla.getCellByPosition(2, 4).String = idArbol ' ID
oSheetPlantilla.getCellByPosition(4, 4).String = oSheetArboles.getCellByPosition(2, i).String ' Especie
oSheetPlantilla.getCellByPosition(2, 5).String = oSheetArboles.getCellByPosition(3, i).String ' Ubicación
oSheetPlantilla.getCellByPosition(4, 5).String = oSheetArboles.getCellByPosition(4, i).String ' Densidad
oSheetPlantilla.getCellByPosition(2, 6).String = oSheetArboles.getCellByPosition(5, i).String ' Orografía
oSheetPlantilla.getCellByPosition(2, 9).String = oSheetArboles.getCellByPosition(6, i).String ' Prob. fallo
oSheetPlantilla.getCellByPosition(2, 10).String = oSheetArboles.getCellByPosition(7, i).String ' Diana
oSheetPlantilla.getCellByPosition(4, 9).String = oSheetArboles.getCellByPosition(8, i).String ' Consecuencias
oSheetPlantilla.getCellByPosition(4, 10).String = oSheetArboles.getCellByPosition(9, i).String ' Riesgo
oSheetPlantilla.getCellByPosition(2, 13).String = oSheetArboles.getCellByPosition(10, i).String ' Cod. Parte afectada
oSheetPlantilla.getCellByPosition(4, 13).String = oSheetArboles.getCellByPosition(11, i).String ' Cod. Localizacion en copa
oSheetPlantilla.getCellByPosition(2, 16).String = oSheetArboles.getCellByPosition(12, i).String ' Intervencion reciente
oSheetPlantilla.getCellByPosition(2, 17).String = oSheetArboles.getCellByPosition(13, i).String ' Cod. Sintoma
oSheetPlantilla.getCellByPosition(4, 17).String = oSheetArboles.getCellByPosition(14, i).String ' Cod. Espec. Sintoma
oSheetPlantilla.getCellByPosition(2, 18).String = oSheetArboles.getCellByPosition(15, i).String ' Grado de defoliacion
oSheetPlantilla.getCellByPosition(2, 19).String = oSheetArboles.getCellByPosition(16, i).String ' Partes afectadas
oSheetPlantilla.getCellByPosition(2, 22).String = oSheetArboles.getCellByPosition(17, i).String ' Cod. Agente
oSheetPlantilla.getCellByPosition(4, 22).String = oSheetArboles.getCellByPosition(18, i).String ' Cod. Espec. Agente
oSheetPlantilla.getCellByPosition(1, 25).String = oSheetArboles.getCellByPosition(25, i).String ' Observaciones
oSheetPlantilla.getCellByPosition(1, 28).String = oSheetArboles.getCellByPosition(26, i).String ' Foto
' Agregar la foto
archivoFoto = directorioFotos & oSheetArboles.getCellByPosition(26, i).String
If FileExists(archivoFoto) Then
InsertarImagen(oSheetPlantilla, archivoFoto, 2, 29) ' Coloca la imagen en la celda (1,29)
End If
' Exportar la hoja como PDF
nombrePDF = "INSERTAR NOMBRE DEL PDF" & idArbol & ".pdf"
rutaPDF = ConvertToURL("C:\Users\...INSERTAR LA RUTA PARA GUARDAR LOS PDF" & nombrePDF)
ExportarAPDF_v1(oDoc, rutaPDF)
Next i
End Sub
Sub InsertarImagen(oSheet As Object, archivoImagen As String, columna As Integer, fila As Integer)
Dim oDrawPage As Object
Dim oImageShape As Object
Dim oPoint As New com.sun.star.awt.Point
Dim oSize As New com.sun.star.awt.Size
Dim oCell As Object
' Limpiar imágenes previas en la hoja
LimpiarImagenes(oSheet)
' Obtener la página de dibujo de la hoja
oDrawPage = oSheet.getDrawPage()
' Obtener la celda de destino y sus propiedades
oCell = oSheet.getCellByPosition(columna, fila)
oPoint.X = oSheet.getCellByPosition(columna, fila).Position.X
oPoint.Y = oSheet.getCellByPosition(columna, fila).Position.Y
oSize.Width = 6480 ' Ajustar el ancho de la imagen
oSize.Height = 11520 ' Ajustar el alto de la imagen
' Crear la forma de la imagen directamente y configurarla
oImageShape = ThisComponent.createInstance("com.sun.star.drawing.GraphicObjectShape")
oImageShape.GraphicURL = ConvertToURL(archivoImagen)
oImageShape.setSize(oSize)
oImageShape.setPosition(oPoint)
' Agregar la imagen a la página de dibujo
oDrawPage.add(oImageShape)
End Sub
Sub ExportarAPDF_v1(oDoc As Object, rutaPDF As String)
Dim args(1) As New com.sun.star.beans.PropertyValue
' Configurar el filtro para PDF
args(0).Name = "FilterName"
args(0).Value = "calc_pdf_Export"
' Configurar para exportar solo la hoja activa
Dim filterData(0) As New com.sun.star.beans.PropertyValue
filterData(0).Name = "Selection"
filterData(0).Value = oDoc.CurrentSelection
args(1).Name = "FilterData"
args(1).Value = filterData
' Exportar el documento como PDF
oDoc.storeToURL(rutaPDF, args)
End Sub
Sub LimpiarImagenes(oSheet As Object)
Dim oDrawPage As Object
Dim i As Integer
' Obtener la página de dibujo de la hoja
oDrawPage = oSheet.getDrawPage()
' Eliminar todos los objetos de la página de dibujo
For i = oDrawPage.Count - 1 To 0 Step -1
oDrawPage.remove(oDrawPage.getByIndex(i))
Next i
End Sub
Si usáis este código y tenéis alguna duda escribidme, estaré encantado de echaros una mano.
M.