RPG for Infoprint Server (Parte 2)
Martin   30 Octubre 2007
museo.jpg El texto en cursiva rojo es la nota que envió Juan Carlos aclarando el tema, lo del RPG es un poco de pegote, hay una parte del CL, que en el cliente donde yo lo probé lo paso a su programa RPG. Lo tenéis en la zona de descargas, me temo que tenéis registraros para descargarlo, es una chorrada que he puesto en marcha en mi servidor, pero meterlos en Document Manager me facilita y me organiza mejor los archivos que el blog.
La foto no tiene nada que ver con el InfoPrint, pero como a mi me gusta poner alguna imagen en las entradas, he puesto el Museo de Arte Contemporáneo de León, esa ciudad tan guapa donde vive Juan Carlos.
Para registraros tenéis una opción en la barra superior, a la derecha, después hay que ir a la zona de descargas, en el centro de la página hay un enlace con la gestión documental.
Es un archivo que se llama info.savf (biblioteca salvada, JCARLOS).


No cabe ninguna duda de que el formato PDF (Portable Document Format) se ha convertido en uno de los principales estándares para intercambio de documentos. Por eso, una de las grandes utilidades que, para mí, tiene el InfoPrint Server de IBM es la posibilidad de generar directamente desde la salida en spool de nuestro iSeries (o I5 o, últimamente, System i) un fichero PDF en una carpeta del sistema de archivos integrado.
Para ello, únicamente tendremos que crear un dispositivo de impresora específico que, a su vez tendrá asignado un archivo de configuración PSF (Printer Server Facilities) que define la forma de generar el fichero PDF.
Debemos, por tanto crear un objeto de configuración PSF de la siguiente manera:
CRTPSFCFG PSFCFG(biblioteca/nombre) PDFGEN(*STMF) PDFPPRDWR1(*A4) PDFPPRDWR2(*A4) PDFDIR('/micarpetaIFS')


Además, crearemos un dispositivo de impresora así:

CRTDEVPRT DEVD(nombre) DEVCLS(*LAN) TYPE(*IPDS) MODEL(0) LANATTACH(*IP) AFP(*YES) PORT(8003) FONT(011) FORMFEED(*CONT) RMTLOCNAME('127.0.0.1') USRDFNOBJ(biblioteca/nombre)
En el parámetro USRDFNOBJ indicaremos el objeto definido anteriormente como configuración PSF.
Y, ya está. El Infoprint Server se encarga de generar un archivo PDF en la carpeta indicada en PDFDIR para cada spool que se envíe a ese dispositivo de impresora. ¿A que es simple?


El único inconveniente que esto tiene es que el Infoprint Server, hace alguna “cosa rara” con la vía de acceso y el nombre del fichero PDF. Por ejemplo, cuando enviemos un archivo de spool a esa impresora, colgará del directorio que hemos indicado en la configuración PSF un nuevo directorio con el nombre del trabajo que generó el archivo en spool. De éste colgará, a su vez, otro con el nombre del usuario que lo generó y en éste último es en el que crea el archivo PDF. Además, y para colmo de males, el nombre del fichero que genera es una cosa “pseudo-inteligible”. Algo así como  040574_000001_QPUOPRTF_10302007_000001.PDF. ¿A qué está claro? Pues bien, troceando un poco este “churro”, llegaremos a la conclusión de que compone el nombre así:
número de trabajo_número de archivo en spool_nombre de archivo en spool_fecha (en formato mmddaaaa)_contador.pdf

Esto hace que localizar un determinado archivo PDF después sea un tanto complejo.


Y aquí es donde la utilidad MOVPDF puede sacarnos del atolladero. Se trata de un programa CL al que deberemos pasarle tres parámetros: el nombre de archivo en spool, el nombre que queremos darle al fichero PDF y la carpeta de destino en que queremos dejarlo. El resultado es que esta utilidad nos dejará el PDF creado por el Infoprint Server en la carpeta que nosotros deseemos y con el nombre que nosotros queramos. Para ello utiliza dos API del sistema que nos permiten recuperar atributos del archivo en spool (QUSRSPLA) y datos de la configuración PSF (QPQRAFPI). Con todos estos datos, el programa compone la vía de acceso y el nombre del archivo en spool generado y lo renombra, moviéndolo a la carpeta indicada en el tercer parámetro. Una versión reducida del mismo programa es la utilidad RENPDF que hace exactamente lo mismo pero dejando el fichero PDF en la carpeta original en que el Infoprint Server lo creó. Por ello, sólo es necesario pasarle dos parámetros: el nombre de archivo en spool y en nombre que quiere darse al PDF.

Un truco imprescindible para que esto funcione es que la llamada a estos procesos debe hacerse desde el mismo trabajo que generó el spool, puesto que recupera el nombre, número y fecha del trabajo y el perfil de usuario desde los atributos del trabajo actual. Otra cosa necesaria es que el archivo en spool quede salvado (parámetro SAVE(*YES) en el mandato CRTPRTF o en el OVRPRTF), para que el API QUSRSPLA pueda recuperar los atributos del mismo aun cuando el transcriptor ya lo ha procesado. Por último, si bien esto no es imprescindible, es conveniente retardar unos segundos (tres suelen ser más que suficientes) la ejecución de esta utilidad después de cerrar el archivo de spool, para dar tiempo al Infoprint Server a generar por completo el fichero PDF en la carpeta correspondiente. Para ello utilizaremos el mandato DLYJOB. Digo que esto no es imprescindible porque, a veces, es casi inmediato. Pero dependiendo de la carga de trabajo de la máquina y el tamaño del archivo en spool, puede ocurrir que, si no hacemos el retardo, la utilidad nos dé un error por no poder encontrar todavía el fichero generado.
Por último indicar que se han incorporado dos mandatos (MOVPDF y RENPDF) para facilitar la ejecución de esta utilidad desde línea de mandatos o programas CL.
Esta utilidad está probada en versión 5.3 de i5/OS. No sé si en versiones anteriores o posteriores podrían cambiar algunos parámetros de las API que utiliza, impidiendo su funcionamiento. No obstante se incluyen los fuentes para que podáis adaptarla a vuestras instalaciones.


Espero que os sirva a todos.


Juan Carlos Paredes.
SIDRA400
Entrada