Sunday, June 29, 2008

Reportes PDF con Report.net - Creación de saltos de página

En esta ocasión voy a explicar cómo realizar un reporte de varias páginas utilizando la librería Report.net (librería gratuita que genera reportes PDF para asp.net) mediante el uso de una variable a que denominé cursor.

Primero deberemos descargar la librería que contiene al assemblie Reports.dll y hacer referencia a los proyectos en los que se utilizarán los reportes.

Para mantener ordenado el código, he creado un proyecto llamado Reportes en el cual tengo la clase ReporteCursor y además creé un proyecto web que hace referencia al anterior y contiene una página llamada Cursor1.aspx.

La clase ReporteCursor hereda de Report propia del namespace Root.Reports. Debido a que todos los elementos del reporte deben ser declarados, y no tenemos una forma automática de hacer saltos de página vamos a declarar la variable cursorActual de tipo double que se irá incrementando cada vez que adicionemos una fila de texto en nuestro reporte. Antes de cada adición de un texto verificaré si el cursor ha sobrepasado el límite de la página también declarada como variable de clase.

Tenemos un override del método Create que realiza todo el trabajo de creación y armado del reporte.

Dentro de Create tenemos tres métodos

  • InicializarReporte() -> Crea una nueva página e inicializa las propiedades de fuentes

  • ProbarSaltoCursor() -> Imprime líneas de texto en el reporte y realiza saltos de página si es necesario

  • CrearPieDePagina() -> Muestra el texto de # de página y total de páginas


A continuación explicaré el método ProbarSaltoCursor. Primero inicializa la variable cursorActual con el valor del margen superior (rPosTop) y mediante una instrucción for que va de 1 a 100 haré el llamado al método CrearLineaDeTexto la misma que realiza el despliegue del texto en la página.


private void ProbarSaltoCursor()
{
// Se inicializa el cursor al valor predeterminado
IniciarCursor();
// Se va a llamar al salto de cursor dentro de un bucle 100 veces
for (int index = 1; index <= 100; index++) CrearLineaDeTexto(string.Format("Imprimiendo linea Nº : {0:00}", index)); }


Dentro del método CrearLineaDeTexto tenemos un método que revisa si el cursor ya ha sobrepasado el límite inferior, si es así se crea una nueva página. Se adiciona el texto que queremos que aparezca en la posición x = 100; y = cursorActual e incrementamos el cursor en 10 unidades.


private void CrearLineaDeTexto(string pTexto)
{
// Primero revisamos si el cursor ha revasado el limite de la pagina
EvaluarSaltoPagina();
// Se adiciona a la pagina el texto en una posicion predeterminada
page_Cur.AddCT_MM(100, cursorActual, new RepString(_propiedadFuente, pTexto));
cursorActual += 10;
}


Concluyendo el método Create tenemos al método CrearPieDePagina que nos imprimirá el número de página y total de páginas en la parte inferior derecha de cada una.

Finalmente en el code-behind de la página Cursor1.aspx tendremos el siguiente código
Archivo.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
ReporteCursor reporte = new ReporteCursor();
RT.ResponsePDF(reporte, this);
}


ReporteCursor.cs

using System;
using System.Collections.Generic;
using System.Text;
using Root.Reports;
using System.Drawing;

namespace Reportes
{
public class ReporteCursor : Report
{
#region Propiedades reporte

FontDef _definicionFuente;
FontProp _propiedadFuente;
FontProp _propiedadFuentePequenia;
FontProp _propiedadFuenteFooter;

// Se definen los bordes de la pagina
internal Double rPosTop = 25;
internal Double rPosBottom = 280;
internal Double rPosLeft = 10;
internal Double rPosRight = 200;

// se define una variable que represente un cursor
double cursorActual;

#endregion

protected override void Create()
{
InicializarReporte();
ProbarSaltoCursor();
CrearPieDePagina();
}

private void ProbarSaltoCursor()
{
// Se inicializa el cursor al valor predeterminado
IniciarCursor();
// Se va a llamar al salto de cursor dentro de un bucle 100 veces
for (int index = 1; index <= 100; index++) CrearLineaDeTexto(string.Format("Imprimiendo linea Nº : {0:00}", index)); } #region Métodos básicos private void CrearPieDePagina() { foreach (Root.Reports.Page page in enum_Page) page.AddRT_MM(rPosRight, rPosBottom + 4, new RepString(_propiedadFuenteFooter, string.Format("Página {0} de {1}", page.iPageNo, iPageCount))); } private void EvaluarSaltoPagina() { if (cursorActual > rPosBottom)
{
IniciarCursor();
NuevaPagina();

page_Cur.AddCT_MM(20, 10, new RepString(_propiedadFuentePequenia, "(Nueva página)"));
}
}
private void InicializarReporte()
{
NuevaPagina();
InicializarPropiedadesReporte();
}
private void InicializarPropiedadesReporte()
{
// Este estilo de fuente debe ser definido sólo una vez
_definicionFuente = new FontDef(this, FontDef.StandardFont.TimesRoman);
_propiedadFuente = new FontProp(_definicionFuente, 10, Color.Navy);
_propiedadFuentePequenia = new FontProp(_definicionFuente, 7, Color.Maroon);
_propiedadFuenteFooter = new FontProp(_definicionFuente, 5, Color.SlateBlue);
}
internal void NuevaPagina()
{
new Root.Reports.Page(this);
}

#endregion

#region Metodos especificos

private void CrearLineaDeTexto(string pTexto)
{
// Primero revisamos si el cursor ha revasado el limite de la pagina
EvaluarSaltoPagina();
// Se adiciona a la pagina el texto en una posicion predeterminada
page_Cur.AddCT_MM(100, cursorActual, new RepString(_propiedadFuente, pTexto));
cursorActual += 10;
}
private void IniciarCursor()
{
cursorActual = rPosTop;
}
#endregion
}
}


Resultado final:



Tamaño del reporte: 7,82KB