Imprimir formulario en PDF autorrellenado con datos de otra hoja

Buenas,

soy usuario novato de Calc y tengo una duda sobre cómo obtener un documento y no sé muy bien cómo encajarlo.

Mi versión de Calc es la 7.6.2.1.

La cosa es que he realizado un inventario y por cada fila hay un objeto, y cada columna es una característica. Pues bien, para cada objeto quiero imprimir un PDF con un formulario estándar para todos, añadiendo una foto, y no sé cómo hacerlo. En total son 644 objetos. Alguna idea?

Muchas gracias!!

Mendiox.

Un procedimiento tentativo, requiere pruebe y corrección de errores, que seguro aparecerán sería:

En principio las fotos de los 644 objetos deberían tener similar tamaño y resolución, y estar alojadas en el mismo directorio (carpeta) del libro de Calc, en la hoja de Calc una columna debería asignar a cada objeto su imagen con la ruta completa, en Windows (que no uso hace muchos años) sería algo así como C:/Users/Usuario/Documents/0bjeto01.png

También sería necesario crear un documento en Writer con el diseño del PDF que deseas imprimir, mediante el menú Herramientas —> Asistente de combinación de correspondencia deberías poder seleccionar el archivo de Calc como base de datos insertando, conforme tu diseño los campos deseados en el lugar correspondiente.

Donde debe ir la foto del objeto coloca un marcador de posición mediante Insertar —> Campo —> Más campos, selecciona el archivo de Calc y elige la columna con la ruta de las imágenes.

Para imprimir debes utilizar Writer, con Archivo —> Imprimir y marcando la opción Combinación de correspondencia, selecciona Imprimir en archivo único y elige PDF como formato de salida, deberías poder especificar si quieres guardar todos los objetos en un solo archivo PDF o cada objeto en un archivo PDF separado.

1 Like

Muchas gracias por la información,
finalmente he conseguido solucionarlo mediante código de macros en BASIC, no obstante me quedo con tu respuesta también pues el procedimiento parece más amigable con el usuario.
Saludos!

Por favor, postea tu solución, para que otros usuarios puedan optar. Muchas gracias.

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.