domingo, 16 de septiembre de 2012

Creación de archivos PDF con PeopleCode (online)

Dependiendo de la versión de PeopleTools hay diferentes herramientas para crear documentos PDF. Específicamente para este tema comento que estoy utilizando la versión de tools 8.44 y Java 4.1

Al ser en línea usamos java, y utilizamos iText, que nos da la funcionalidad que requerimos.

Desde esta ubicación pueden tanto descargar el ejecutable ( .jar) como el código fuente, si es que lo requieren. Viene la referencia de todas las clases, de forma que podemos revisar como usarlo.

Repito, según la versión de Java que estén utilizando es la versión de iText que deben utilizar, en este caso estoy utilizando la 2.0.8.

El archivo JAR lo deben ubicar a donde apunte PS_CLASSPATH, de estar vacía es necesario que la definan, de otra forma no funciona.

Dicho lo anterior, entramos en tema.


Los primeros pasos son:

/* Crea un objeto de tipo documento */
Local string &MyFile = "myfile.pdf";
Local JavaObject &Obj_Doc = CreateJavaObject("com.lowagie.text.Document");


/* Podemos desde un inicio cargar clases complementarias que vamos a usar */
Local JavaObject &Obj_Font = CreateJavaObject("com.lowagie.text.Font");
Local JavaObject &Element = GetJavaClass("com.lowagie.text.Element");

/* es importante obtener la ruta en donde deja los archivos para que posteriormente podemos tomar los mismos*/
&ambiente = GetEnv("PS_HOME");

/* Obtiene una instancia de PDF Writer */
Local JavaObject &obj_PDFoutput =
GetJavaClass("com.lowagie.text.pdf.PdfWriter").getInstance(&Obj_Doc, CreateJavaObject("java.io.FileOutputStream", &ambiente | "/" |
&MyFile, True));

/* y abrimos el documento para comenzar a escribir */
&Obj_Doc.open();


Bien, ya tenemos abierto el archivo y podemos comenzar a llenar el documento. Podemos agregar directamente texto e imágenes, pero con finalidad de darle una mejor presentación podemos utilizar tablas, para acomodar mejor la información en el documento.


/* Creación de una tabla */
/* El número de renglones no es necesario especificarlo, pero las columnas si */
Local JavaObject &Obj_Table = CreateJavaObject("com.lowagie.text.Table", 6)

/* creado el objeto tabla, se establecen propiedades */
&Obj_Table.setWidth(100);
&Obj_Table.setBorderWidth(0);
&Obj_Table.setDefaultCellBorderWidth(0);

/* creada la tabla, se deben de ir incluyendo las celdas*/
Local JavaObject &cell = CreateJavaObject("com.lowagie.text.Cell");

/* se especifican sus propiedades */
&cell.setBorderWidth(&border);
&cell.setHorizontalAlignment(&AlinearHorizontal);
&cell.setVerticalAlignment(&AlinearVertical);

/* En este punto es cuando se agrega a la celda aquello que se vaya a presentar */

/* ... agregando una imagen a la celda */
Local JavaObject &Obj_Img = GetJavaClass("com.lowagie.text.Image").getInstance(&URLImagen);
/* se establecen propiedades */
&Obj_Img.scaleAbsolute(50, 50);
/* se agrega a la celda */
&cell.addElement(&Obj_Img);

/* finalmente se agrega la celda a la tabla, incluso se puede especificar la posición exacta dentro de la tabla */
Local float &Row, &Column;
&Row=1;
&Column=3;
&Obj_Table.addCell(&cell, &Row, &Column);

/* … agregando texto a la celda, y especificando el COLSPAN */
/* primero creamos la fuente */
Local JavaObject &fuente = CreateJavaObject("com.lowagie.text.Font", 1);
&fuente.setSize(&TamanioFuente);
&fuente.setStyle("bold");
Local JavaObject &Obj_Parrafo = CreateJavaObject("com.lowagie.text.Paragraph", “Texto a Mostrar”, &fuente);

/* Creamos la celda */
Local JavaObject &cell = CreateJavaObject("com.lowagie.text.Cell");
&cell.setColspan(2);
&cell.setWidth(&Ancho);
&cell.setBorderWidth(&border);
&cell.setHorizontalAlignment(&AlinearHorizontal); /* 0,1,2 -> Izq, centro, derecha */
&cell.setVerticalAlignment(&AlinearVertical);
&cell.addElement(&Obj_ Parrafo);
/* agregamos a tabla */
&Obj_Table.addCell(&cell, &Row, &Colum);

/* Agregando una imagen directamente al documento */
Local JavaObject &Obj_Img = GetJavaClass("com.lowagie.text.Image").getInstance(&URLImagen);
&Obj_Img.scaleAbsolute(&Width, &Height);
&Obj_Doc.add(&Obj_Img);

/* Agregar texto directamente al documento */
Local JavaObject &fuente = CreateJavaObject("com.lowagie.text.Font", 12); /* desde aquí se puede especificar el tamaño o posteriormente */
&fuente.setSize(&TamanioFuente);
&fuente.setStyle("bold");
Local JavaObject &Obj_Parrafo = CreateJavaObject("com.lowagie.text.Paragraph", “Texto a Mostrar”, &fuente);
&Obj_Parrafo.setAlignment(&Alinear);
&Obj_Doc.add(&Obj_Parrafo);


/* Como último paso es cerrar el documento */
&Obj_Doc.close();

Listo, ya tenemos listo el documento, ahora tendríamos que moverlo, mostrarlo y/o guardarlo, mandarlo por correo, etc ... 

Aquí solo mostraré como moverlo a una ubicación de FTP y mostrar el archivo


/* Obtiene el archivo desde la ubicación donde esta el application server y lo manda a otra ubicación, en este caso de FTP */
&salida = PutAttachment(URL.MiURL, "/psmysite/" | &MyNewFile, &ambiente | "/" | &MyFile);


/* Muestra el archivo desde la ubicación de FTP */
&salida = ViewAttachment(URL.MiURL, "/psmysite/" | &MyNewFile, &MyNewFile, True);

/* Eliminamos el archivo copiado después de haberlo mostrado*/
&salida = DeleteAttachment(URL.MiURL, "/psmysite/" | &MyNewFile);



6 comentarios:

  1. hola, podrias especificarme porfa esto:
    "El archivo JAR lo deben ubicar a donde apunte PS_CLASSPATH, de estar vacía es necesario que la definan, de otra forma no funciona."
    donde defino eso??

    ResponderBorrar
    Respuestas
    1. Hola,

      Si estas en UNIX, LINUX ( o variantes) la deberás especificar en el archivo .profile (solo añádela al archivo) del usuario que levanta los servicios del APPSRV.

      Sería algo así como esto:
      PS_CLASSPATH=$PS_HOME/appserv/classes;export PS_CLASSPATH

      En Win declarala como variable del sistema (en propiedades de MiPC, en variables de entorno)

      set PS_CLASSPATH=c:\PS\appserv\classes

      Hecho eso, deberás reiniciar tus AppSrv para que tomen el cambio.

      Saludos,

      Borrar
  2. Estimados, se pueden adjuntar archivos en un PDF creándolo por código? Podrían indicarme como se hace? Muchas gracias!!

    ResponderBorrar
  3. Si es posible, puedes revisar esta documentación:

    https://kb.itextpdf.com/home/it7kb/faq/how-to-attach-files-to-a-pdf

    No he tenido experiencia aún realizando eso, hasta ahora no me lo han solicitado en ningún lado :/ pero siempre hay una primera vez.

    ResponderBorrar
  4. Tengo seteada la variable. Pero me arroja este mensaje: Los objetos de la clase java.io.File no pueden incluirse en la serie (2,694)

    ResponderBorrar
    Respuestas
    1. Que versión de PSTools usas? en que evento están corriendo ese peoplecode y en qué línea de código te lo está marcando?

      Borrar

Translate