Mono, Gnome.Print y Pango

Cuando entregamos el TP de diseño, Catedrax usaba como generador de reportes a NeoDataType. Éste es un generador gratuito, pero no libre, por lo que decidimos dejar de usarlo.

Me puse a buscar en SourceForge algún reemplazo, pero no encontré nada que convenza. Ahora un requisito más es que funcione con Mono, ya que nos pasamos a esta implementación libre de .NET.

Entonces me puse a ver la documentación de Gnome.Print (API de impresión para Gnome), y probé algunos ejemplos. Ahora tengo armado un proyecto, MonoReporter, un generador de reportes para Mono. Pronto, cuando tenga algo mas pulido, lo voy a publicar.

Pango es una API para manejo avanzado de fuentes. Lo empecé a utilizar cuando vi la necesidad de centrar un texto en una celda, por ejemplo. Es decir, para centrarlo necesito las medidas del texto, y esto no se puede hacer con Gnome.Print. Es necesario algo mas avanzado.

Por ahora, éste es el código necesario para crear un reporte:

Reporte reporte = new Reporte ("Reporte de prueba", 75, 50, 75, 50);
Pagina pagina = reporte.AgregarPagina();

string[][] datos = new string[10][];
for (int i=0; i<datos.Length; i++)
        datos[i] = new string[3];

datos[0][0] = "Nombre";
datos[0][1] = "Apellido";
datos[0][2] = "Ciudad";

datos[1][0] = "Milton";
datos[1][1] = "Pividori";
datos[1][2] = "Avellaneda";

datos[2][0] = "Nombre1";
datos[2][1] = "Apellido1";
datos[2][2] = "Ciudad1";

double[] anchura = {125, 125, 200};
Tabla tabla = new Tabla (pagina, 55, 800, "Listado de alumnos", datos, anchura);
pagina.AgregarObjeto(tabla);
reporte.Imprimir();

Ese código genera esto:

Jugando con Eufruncio

Si, es un reporte MUY humilde. Pero lo importante es que los pasos básicos ya estan hechos.

Hay cosas que están de más en el código anterior: El usuario no debería agregar las páginas, de esto se encargaría MonoReporter. Eso es verdad, pero por cuestiones de pruebas, va a quedar así hasta que libere una versión funcional. Otra cuestión es el array de arrays de strings: no debería ir eso, sino un DataTable.

Estaría bueno poder usar algo ya existente, como JasperReports, pero éste esta disponible sólo para Java. Aca podemos hablar de una de las ventajas del framework .NET: independencia del lenguaje. Hay un proyecto, IKVM.NET, que intenta ser una implementación de Java para .NET y Mono. Lamentablemente, aunque goza de un desarrollo activo, carece de una buena implementación de AWT (usado por JasperReports), y de la página del proyecto leemos:

IKVM.AWT.WinForms.dll: Very limited and broken implementation of a few AWT peers. This is a low priority issue for me.

Por lo que no esperemos usar, por lo menos en el corto plazo, ese generador de reportes. Yo seguiré con MonoRerpoter…