Lunes, 2 Octubre 2006
Hay veces que es mucho más sencillo rellenar campos en archivos PDF (llamados Acrofields) diseñados previamente con Acrobat Writer o alguna otra herramienta similar que crearlos desde cero en Java con todo el diseño de líneas, dibujos, …Afortunadamente y gracias a la librería iText, desde Java es muy sencillo realizar esta tarea:
import java.io.FileOutputStream;
import com.lowagie.text.pdf.AcroFields;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
public class Main {
public static void main(String[] args) {
try {
// leo la plantilla
PdfReader reader = new PdfReader("c:\\pdf\\plantilla.pdf");
// creo la salida
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream("c:\\pdf\\plantilla_rellena.pdf"));
// relleno los campos
AcroFields form1 = stamp.getAcroFields();
form1.setField("campo1", "valor1");
form1.setField("campo2", "valor2");
form1.setField("campo3", "valor3");
// ...
// acepto y cierro
stamp.setFormFlattening(true);
stamp.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Miércoles, 17 Mayo 2006
Seguro que si sigues las novedades de Google te has enterado de que ha salido el Google Calendar para que gestiones tu agenda. Incluso te habrás enterado de que ha salido el Google Notebook que te permite tomar notas de páginas web usándolo como un “social bookmarking”.
Pero de lo que no se ha oido tanto hablar es del Google Web Toolkit (GWT). Se trata de un framework de desarrollo de aplicaciones Java que facilita la generación de aplicaciones AJAX.
Para usarlo sólo tienes que desarrollar tu aplicación en lenguaje Java (J2SE no J2EE) usando unas clases de Google en vez de los widgets de Swing y, cuando despliegas la aplicación, el compilador GWT traduce la aplicación Java a un sistema AJAX para usarlo en un entorno web.
En principio pinta estupendo. A ver si saco un poquito de tiempo para meterle mano y contaros qué tal funciona.
Jueves, 11 Mayo 2006
Si vísteis la entrada de ayer veríais la galería de imágenes que se iban cargando con un efecto de fundido y de redimensionamiento sin usar ventanas aparte.
Está hecho con un Javascript llamado Lightbox, nada de Flash ni Java, sólo Javascript y en dos pasos.
Lo primero es incluir la hoja de estilos y los javascriot necesarios. Hay que tener en cuenta que Lightbox hace uso de la librería Scriptaculous aunque el .js viene metido en la distribución de Lightbox.
<link rel="stylesheet" href="css/lightbox.css" type="text/css" media="screen" />
<script type="text/javascript" src="js/prototype.js"></script>
<script type="text/javascript" src="js/scriptaculous.js?load=effects"></script>
<script type="text/javascript" src="js/lightbox.js"></script>
Ya sólo hay que incluir un enlace en la página en el que el atributo href apunta a la imagen, el atributo rel debe llevar la palabra “lightbox” y, opcionalmente unos corchetes con el nombre de grupo para agrupar las imágenes y un atributo title opcional con el texto que debe aparecer en la imagen.
<a href="images/imagen1.jpg" rel="lightbox[grupo]" title="Titulo 1">imagen 1</a>
<a href="images/imagen2.jpg" rel="lightbox[grupo]" title="Titulo 2">imagen 2</a>
<a href="images/imagen3.jpg" rel="lightbox[grupo]" title="Titulo 3">imagen 3</a>
Aunque en este ejemplo sólo son tres enlaces de texto lo suyo sería poner los thumbnails de las imágenes en su lugar.
<a href="images/imagen1.jpg" rel="lightbox" title="Titulo 1"><img src="images/imagen1.thumbnail.jpg"/></a>
Viernes, 21 Abril 2006
Suelo usar Excel en las aplicaciones Java en dos contextos:
El primero es para realizar actualizaciones de tablas de base de datos desde hojas excel, cada hoja es una tabla y los datos vienen tabulados. De esta forma evito el tener que crear pantallas innecesarias de Altas/Bajas/Modificaciones que, encima, pueden ser un engorro si el usuario quiere realizar muchas modificaciones sobre los datos.
El otro uso que le doy es devolver datos al usuario para que luego pueda operar sobre los mismos de forma sencilla.
Para ambos casos uso la librería Apache POI ya que permite gestionar archivos Excel (también archivos Word aunque no lo he usado nunca con ese tipo de archivos).
Vamos a hacer un ejemplo para generar un Excel que tenga una gráfica incrustada con datos obtenidos dinámicamente.
POI no permite incrustar gráficas pero sí es capaz de modificar archivos Excel que ya estén creados y que las tengan ya incluidas. Debido a esto, lo primero es crear un Excel directamente con el Microsoft Excel y que tenga una Hoja llamada Totales. He creado el ejemplo y lo puedes descargar de aquí.
Y ya sólo hay que hacer el código que procese el Excel:
package net.jmsanz;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
public class Main {
public static void main(String[] args) {
try {
InputStream fis = Main.class.getResourceAsStream("totales.xls");
POIFSFileSystem fs = new POIFSFileSystem (fis);
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheet("Totales");
HSSFRow row = sheet.getRow((short) 1);
row.getCell((short) 1).setCellValue(4);
row.getCell((short) 2).setCellValue(8);
row.getCell((short) 3).setCellValue(3);
FileOutputStream fos = new FileOutputStream("totales_poi.xls");
wb.write(fos);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Mucho ojo con los streams ya que se lee en la variable fs (FileSystem) pero escribimos con la wb (WorkBook), de escribir con la fs estaríamos guardando el Excel original.
Jueves, 6 Abril 2006
Hoy vamos a ver un ejemplo paso a paso sobre como montar un Web Service hecho en Java y desplegado en Weblogic de la forma más simple posible en 5 minutos y sobrándote 3 para ir a tomar un café. El único prerequisito es que tienes que saber cómo crear una webapp (.war) clásica.
Para el ejemplo, vamos a hacer un Web Service con dos operaciones sumar y restar.
Paso 1. Crear la clase plana net.jmsanz.ws.Matematicas
package net.jmsanz.ws;
public class Matematicas {
public final int sumar(final int a, final int b) {
return a + b;
}
public final int restar(final int a, final int b) {
return a - b;
}
}
Paso 2. Crear el archivo web-services.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-services>
<web-service name="services" targetNamespace="http://www.jmsanz.net" uri="/ws">
<components>
<java-class name="matematicas" class-name="net.jmsanz.ws.Matematicas" />
</components>
<operations>
<operation component="matematicas" method="sumar"/>
<operation component="matematicas" method="restar"/>
</operations>
</web-service>
</web-services>
Paso 3. Compilar y crear el WAR
Creamos el archivo jmsanzws.war con la clase Matematicas.java compilada y metida dentro del directorio correspondiente y con el archivo web-services.xml dentro del directorio WEB-INF junto a web.xml.
Paso 4. Desplegar y probar
Dentro de la consola de Weblogic, desplegamos la aplicación web jmsanzws.war de la forma habitual.
Una vez desplegado vamos a la pestaña Testing y veremos un enlace con el título Launch Test Page. En nuestro caso aparece un enlace como el siguiente: http://localhost:7001/jmsanzws/ws. Este enlace lleva a una página en la que aparecen todas las operaciones disponibles y un formulario web en el que puedes insertar los datos de los parámetros de las operaciones para realizar pruebas y ver el mensaje SOAP que se envía y el mensaje SOAP devuelto.
Paso 5. Ir a tomar el café
y vaguear los 3 minutos sobrantes.
Trucos y consejos
Como ves, el ejemplo es harto sencillo aunque me he dejado un montón de cosas en el tintero. Por ejemplo:
- No es necesario crear el WSDL sino que Weblogic es tan listo que lo hace él solito y lo deja en http://localhost:7001/jmsanzws/ws?WSDL
- Si no quieres que Weblogic genere las páginas de prueba tienes que indicarlo metiendo el atributo exposeHomePage=”false” dentro del elemento <web-service>
- Las líneas de operaciones declaradas en el XML no indican los parámetros, Weblogic es capaz, por introspección, de averiguarlo.
- La multiplicación, la división, … :-p
Si quieres más información tienes todo en la página Programming WebLogic Web Services de Bea
« Artículos anteriores