Beruflich Dokumente
Kultur Dokumente
Índice de contenido
Problemática.........................................................................................................................................1
Solución................................................................................................................................................1
Que es lo que necesito..........................................................................................................................2
El programa..........................................................................................................................................3
Referencias al software usado..............................................................................................................3
Forma de usar el programa...................................................................................................................3
Limitaciones conocidas........................................................................................................................4
Pruebas de rendimiento........................................................................................................................4
Código del programa............................................................................................................................4
Licenciamiento de los documentos....................................................................................................16
Problemática
Se necesita hacer llegar de manera más eficiente las nóminas de cada uno de los empleados
de una empresa. A ser posible hacerles llegar a la misma vez que se generan las nóminas, para que
esta documentación la tenga cada empleado.
El programa que se usa para generar las nóminas el Nomina Plus de la empresa SAGE.
Es verdad que el procedimiento que usa este programa no es muy operativo y hace que sea
tedioso y difícil de usar. Aunque se tiene soporte por parte del fabricante de la aplicación, éste no
está por la labor de facilitar procedimientos alternativos e integrados con su programa. Así aunque
desde el propio programa ofrece la funcionalidad de envío de esta información por correo
electrónico, este no es ni funcional ni operativo.
De la incapacidad de poder obtener un sistema sencillo y fiable por parte de la empresa
SAGE surge esta aplicación, que consiste en intentar solventar esta limitación y hacer que el
personal de recursos humanos de la empresa sea capaz de distribuir las nóminas en el mismo
momento en que se generen.
Solución
Vamos a intentar maximizar los que hace bien SAGE y lo que podemos hacer sin depender
de su servicio técnico.
Para ello lo primero que instalaremos en el ordenador que tiene instalado Nómina Plus una
impresora virtual que convierte lo que deseamos imprimir por SAGE a documentos PDF.
Hemos utilizado la última versión de PDFCreator.
Con esto podemos generar en un sólo documento PDF las nóminas que seleccionemos y la
generación de este documento es muy rápido.
Al margen de esto hemos creado en el programa de nóminas un nuevo tipo de impreso,
acorde a las necesidades de impresión de una nómina, donde básicamente hemos modificado el que
trae SAGE y lo hemos puesto centrado en una hoja A4. No hemos añadido ningún logo.
Pag. 1 de 16
Distribución de nóminas por correo electrónico Julio Ríos
Desde Nómina Plus somos capaces de hacer un documento PDF con las nóminas de todos
los empleados de manera muy rápida.
Nómina Plus permite trabajar con varias empresas por eso nosotros vamos a generar varias
plantillas (una plantilla por empresa) con su logo, pie de página, lateral y firma del responsable de
recursos humanos.
Estas plantillas han sido confeccionadas con LibreOffice y se han generado al final tantos
documentos PDF con empresas que gestione Nómina Plus.
Como nuestro origen de datos es uno o varios documentos PDF, necesitaremos herramientas
para la manipulación de estos ficheros.
El resultado final del proceso será el envío de un documento PDF a la dirección electrónica
con el contenido de la nómina del mismo.
Para hacer esto usaremos el programa PDFTK, el cual nos permitirá manipular el
documento pdf que contiene todas las nóminas.
Con este programa generaremos tantos ficheros PDF como hojas que tenga el documento
original, asumiendo siempre que una nómina ocupa una y sólo una nómina.
La forma de conseguir esto es ejecutando este comando
pdftk origen.pdf burst output paginaJ_02d%.pdf
Una vez generados los arhivos pdf individualizados necesitaremos saber a quien
corresponde cada uno
Buscar contenido en PDF es complejo pero afortunadamente podemos convertir mediante otra
herramienta el contenido del PDF a formato TXT donde encontrar información es mucho más
sencillo. La herramienta que usaremos es PDFTOTXT
Así con esta herramienta generaremos ficheros TXT
pdftotext fichero.pdf
Generado todo lo necesario buscaremos a quién pertenece cada documento PDF y se lo
enviaremos por correo electrónico usando la herramienta sendemail, pero antes del envío
modificaremos el documento original y le añadiremos los logos de la empresa mediante de nuevo el
programa pdftk
pdftk fichero.pdf background marca.pdf output salida.pdf
Pag. 2 de 16
Distribución de nóminas por correo electrónico Julio Ríos
El programa
El programa está escrito en visual basic script para una fácil manipulación y adaptación.
Al principio del código se deben cambiar los parámetros necesarios que son:
Cuenta de correo (usuario, contraseña de la cuenta de envío, servidor de correo)
Ficheros de marca de agua
Ficheros de usuarios donde se debe escribir el DNI del usuario, Nombre del usuario,
dirección de correo del envío, marca de agua para embellecer el documento.
Este fichero de usuario debe ser en formato csv con separador ; entre campos y se puede
usar cualquier editor de texto para crearlo.
La limitación que tiene es que debemos evitar los caracteres especiales en el campo nombre,
tal como las ñ o acentos.
Pag. 3 de 16
Distribución de nóminas por correo electrónico Julio Ríos
de nóminas
Los ficheros sendemail.exe y sendemail.txt (que se usan para el envío de los correos), los
ficheros pdftk.exe y pdftotext.exe junto con el fichero libiconv2.dll que se usan para gestionar los
pdf originales y generar las pdf a entregar al usuario.
El fichero usuarios.csv, donde debemos especificar los datos necesarios para el envío de las
nóminas y que debe estar en este formato:
[DNI];[Nombre usuario];[dirección electronica de envío];[marca de agua a usar]
El fichero procesar nóminas.vbs que es el programa en sí
Luego crearemos un acceso directo a este fichero para ejecutar el programa con un simple
doble clic sobre este acceso directo.
Limitaciones conocidas
Los ficheros de marca de agua en formato deben coincidir con el contenido de la variable
MarcasDeAgua del programa. Estos son los únicos ficheros pdf que el programa no procesará.
Los nombres que están definidos en el fichero usuario no deben contener al menos ñ o
acentos porque cuando se generan los ficheros correspondientes el programa de conversión falla
El programa sólo buscará la primera nómina dentro de los documentos PDF. No buscará
más. Esto es así porque SAGE sólo permite imprimir nóminas de un periodo de tiempo
determinado. Así que si ponemos varios PDF de varios periodos determinados el programa sólo
enviará el primero que encuentre y no todos. Así que se debe ejecutar el programa por cada periodo
de tiempo que se genere.
También se asume que cada nómina ocupa una y sólo una página, si esto no fuera así el
programa no haría bien su trabajo y habría que redefinir el mismo.
Pruebas de rendimiento
Se ha ejecutado el programa en la misma máquina que se generan las nóminas y se ha
observado que el envío de 110 nóminas el programa ha tardado apenas 90 segundos.
La rapidez de la aplicación depende de la potencia del ordenador donde se ejecute y la
conexión al servidor de correo, que cuanto más rápida sea menos tardará en enviar esta información
por este método.
El programa al final envía un fichero log por correo electrónico al operador del programa.
Si todo ha ido bien el sistema es “limpio” y borra todo el fichero que genera, es decir al final
de la ejecución deberemos tener en la carpeta de nuestra aplicación los mismos ficheros.
Todos los resultados generados por el programa se deben ver en las diferentes cuantas de
correo electrónico.
Pag. 4 de 16
Distribución de nóminas por correo electrónico Julio Ríos
' Script para procesar y enviar por correo electrónico las nóminas generadas con sage
' License: GPL (http://es.wikipedia.org/wiki/GNU_General_Public_License)
' Version: 1.0.0.0
' Date: Marzo, 2011
' Author: Julio Ríos (julio punto rios punto 2006 arroba gmail punto com)
' Se necesitan los pdf donde están las nominas (cada pagina es una nomina que hay que enviar a una
persona distinta)
Option Explicit
Dim AsuntoMensaje ' Varaible que contiene parte del asunto que se enviara por correo electrónico
Pag. 5 de 16
Distribución de nóminas por correo electrónico Julio Ríos
' Dado un fichero pdf generamos un fichero PDF añadiendo una marca de agua que hay en otro PDF
' Borramos los residuos generados, doc_data.txt y el fichero original
' El nombre de los ficheros si contienen blancos entre comillas
Pag. 6 de 16
Distribución de nóminas por correo electrónico Julio Ríos
Aux = "%comspec% /c pdftk """ & Fichero & """ background """ & Marca & """ output
""" & Nombre & """"
'WScript.Echo "Ejecuto: " & Aux
On Error Resume Next
Set objShell = CreateObject("Wscript.Shell")
objShell.Run Aux, , true
End Sub
' Funcion de vuelve el nombre del fichero si este contiene la cadena a buscar y sino devuelve vacio
Function EncontrarTXT (Fichero, cadenaTexto)
Dim oFich, objFso
Dim Encontrado ' Variable booleana para hacer el bucle
Dim cadena, Aux
oFich.Close
Pag. 7 de 16
Distribución de nóminas por correo electrónico Julio Ríos
EncontrarTXT = Aux
End Function
' busca dentro de los TXT que aparezca la cadena de texto y si lo encuentra devuelve el nombre del
fichero y sino ""
Function BuscarenTXT (cadenaTexto)
Dim Aux, Encontrado
Dim objFso, objFiles, fileList
Dim i, ListadeFicheros, ArraylistadeFicheros
Aux = ""
Encontrado = False
If cadenaTexto <> "" Then
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFiles = objFso.GetFolder(".\")
Set fileList = objFiles.Files
Pag. 8 de 16
Distribución de nóminas por correo electrónico Julio Ríos
Pag. 9 de 16
Distribución de nóminas por correo electrónico Julio Ríos
' Borramos los ficheros TXT que dice el array y enviamos sus homólogos pdf al operador
Pag. 10 de 16
Distribución de nóminas por correo electrónico Julio Ríos
'Veo que fichero TXT queda y les envío al operador su PDF asociado y los borro
Sub LimpioBasura
Dim objFso, objFiles, fileList
Dim Aux, FicherosTXT, i
FicherosTXT = ""
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFiles = objFso.GetFolder(".\")
Set fileList = objFiles.Files
Pag. 11 de 16
Distribución de nóminas por correo electrónico Julio Ríos
' Dado un fichero pdf generamos tantos pdf como paginas tenga el original
' Borramos los residuos generados, doc_data.txt y el fichero original
' Los generamos pdftk Fichero.pdf burst output paginaj_%02d.pdf
' Si contiene blancos el fichero se debe pasar entre comillas dobles
Sub GenerarPaginasIndividuales(Fichero, numero)
Dim objShell, Aux
Dim nombreAux
nombreAux = PrefijoFicherosPDF & numero & "_%02d.pdf"
Call EscribirLog(LogFichero, Now & ";" & "Generando los ficheros individuales: " &
Fichero & " ;" & Now)
Aux = "%comspec% /c pdftk """ & Fichero & """ burst output " & nombreAux
'WScript.Echo "Ejecuto: " & Aux
On Error Resume Next
Pag. 12 de 16
Distribución de nóminas por correo electrónico Julio Ríos
Call EscribirLog(LogFichero, Now & ";" & "Generando el fichero TXT: " & Fichero & " ;"
& Now)
Aux = "%comspec% /c pdftotext """ & Fichero & """"
'WScript.Echo "Ejecuto: " & Aux
On Error Resume Next
Set objShell = CreateObject("Wscript.Shell")
objShell.Run Aux, , true
End Sub
Pag. 13 de 16
Distribución de nóminas por correo electrónico Julio Ríos
End If
Next
Set objFso = Nothing
Set objFiles = Nothing
Set objFiles = Nothing
End Sub
' Función que lee todos los pdf y genera tantos pdf como páginas tengan estos
' Necesitamos el asunto del mensaje que vamos a enviar
Sub PartirPDF (AsuntoTeclado)
Dim objFso, objFiles, fileList
Dim i, j
Dim NombreFichero
Dim FicherosAProcesar 'Contiene todos los PDF que vamos a procesar
Dim ArrayNombreFicheros 'para partir los nombres de los ficheros que se van a generar en
FicherosAProcesar
j = 0 ' numero de fichero procesados
FicherosAProcesar = ""
' Listamos todos los PDF del directorio
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFiles = objFso.GetFolder(".\")
Set fileList = objFiles.Files
For Each i In fileList
If objFso.GetExtensionName(i.name) = "pdf" Then
' Si el nombre del fichero no es ninguno de MacasdeAgua Se puede Procesar
If InStr(1, MarcasDeAgua , i.name, 1) = 0 Then
If FicherosAProcesar = "" Then
' Primer Fichero
FicherosAProcesar = i.name
Else
FicherosAProcesar = FicherosAProcesar & ";" & i.name
End If
j=j+1
End If
Pag. 14 de 16
Distribución de nóminas por correo electrónico Julio Ríos
End If
Next
'WScript.Echo "Ficheros: " & j & " *** " & FicherosAProcesar
Set objFso = Nothing
Set objFiles = Nothing
Set objFiles = Nothing
' Procesamos los Ficheros
If FicherosAProcesar = "" Then
Call EscribirLog(LogFichero, Now & ";" & "No hay PDF que procesar." & ";" &
Now)
Else
' Generamos los PDF por paginas
' FicherosAProcesar contiene los nombres de los archivos pdf que vamos a procesar
delimitados por ;
ArrayNombreFicheros = Split(FicherosAProcesar, ";")
For j = LBound(ArrayNombreFicheros) To UBound(ArrayNombreFicheros)
Call EscribirLog(LogFichero, Now & ";" & "Procesando el fichero: " &
ArrayNombreFicheros(j) & " ;" & Now)
' Debemos generar tanto pdf como paginas tenga
Call GenerarPaginasIndividuales(ArrayNombreFicheros(j), j)
Next
' Se han generado muchos ficheros pdf (pagina*.pdf)
Call ConvertirPDFaTXT
' Se ha generado muchos fichero txt del estilo pagina.txt
' Ahora tengo pdf y txt y un fichero de usuarios
Call ProcesoUsuarios(AsuntoTeclado)
Call LimpioBasura
End If
End Sub
Pag. 15 de 16
Distribución de nóminas por correo electrónico Julio Ríos
Pag. 16 de 16