PDA

Ver la Versión Completa : Impresion de documentos a través del canvas


egostar
29-05-2006, 23:24:26
Estimados colegas,

Desde que entre a este foro he podido solucionar muchos problemas gracias a la buena voluntad de los integrantes del mismo.

Por esta razón quiero corresponder con mi granito de arena con este pequeño trabajo que espero sea de utilidad.

Se que esto puede ser mejorado y agradeceré todas las críticas que se haga de él.


A través del tiempo me he visto en la necesidad de imprimir documentos (frecuentemente Facturas) los cuales resultan hasta cierto punto complejos al utilizar reporteadores como Quick Report, Fast Report, Rave, etc.


Para solucionar este problema he utilizado el objeto TPrinter, sin embargo, al hacer uso de su propiedad Canvas, es necesario, determinar las coordenadas (pixeles) donde se van a “dibujar” los textos, cuestión que obliga a trabajar horas extras para configurar todos los campos que se desean imprimir, incluso, si por alguna razón la impresora que se utilizó para configurar el documento es reemplazada y esta no tiene la misma densidad de impresión, sería necesario volver a configurar las coordenadas del canvas para que la impresión vuelva a coincidir en el documento.


Esto no sería tan problemático si el sistema que se desarrollo solo es para un cliente y solo un documento, sin embargo, si se piensa comercializar dicho sistema los problemas crecen de manera exponencial a grado tal (pensando positivamente, claro está) que se podría convertir en un dolor de cabeza.


Por tal motivo, me di a la tarea de crear una aplicación que me ayudara a configurar documentos de una manera fácil y que me generara un archivo con las coordenadas para cada campo dentro del área de impresión y poder usar estos valores para ahorrar tiempo y esfuerzo.


La conceptualización de esta aplicación es la siguiente:



Utilizando un archivo plano (Confimpresion.txt) cargar los campos que van a ser impresos en el documento, para que estos sean cargados en lugares especificos dentro de la forma.
Generar una matriz con la definición de la impresora predeterminada a través de un StringGrid.
Imprimir una hoja con la misma matriz (en una copia de una factura, de preferencia) para poder determinar en que (columna, renglon) debe ir cada campo.
Con el concepto Drag & Drop mover los campos a la matriz correspondiente.
Guardar en un archivo INI, la información de las coordenadas de cada campo.

El archivo Confimpresion.txt contiene la lista de los nombre de los campos que serán impresos en el documento y su formato es <Nombre Campo>,<Longitud del campo>


Por Ejemplo


Razon Social,50
Direccion,50
Ciudad,30
Estado,30


Existen algunas condiciones dentro de los campos que se van a imprimir, exclusivamente para aquellos que requieren de imprimirse de forma detalle como son las partidas de una factura por ejemplo. Para esto es necesario que se agregue la palabra Detalle antes del campo.


Por ejemplo


Detalle Partida,10
Detalle Descripcion,50
Detalle Precio, 20
Detalle Importe,20


Esto permite que esos campos se puedan “jalar” hacia abajo para determinar cuantas lineas se podrán imprimir dentro de la Factura. Esto se hace seleccionando el campo en el StringGrid y sin soltar el mouse "jalar" hacia abajo hasta la pocision donde se desea que termine el detalle.


Para borrar algun dato que se ha puesto en una posicion incorrecta, boton derecho del mouse y click en Quitar.


El archivo INI creado se localiza en el directorio de WINDOWS y se llama CONFIMPRESION.INI el cual contiene las coordenadas de cada campo que se va a imprimir, y en el caso de los campos detalle tienen un valor adicional que corresponde al numero de lineas que se pueden imprimir.




Por ejemplo


[MATRIZ]
Razon Social=63,48 coordenadas (63,48)
Detalle Descripcion=189,160,15 coordenadas (189,160), 15 lineas



Saludos.

seoane
29-05-2006, 23:41:48
Puede que te resulte mas sencillo trabajar en milimetros que en pixels para diseñar tus facturas. Estas funciones te pasan de milimetros a pixels, midiendo los milimetros desde la esquina superior izquierda del papel. Asi solo tienes que diseñarla con un lapiz sobre una hoja de papel y luego utilizar una regla para medir :D


uses Printers;

function mmToPixelsX(X: Real): Integer;
var
PixelsPerInchX: Integer;
OffsetX: Integer;
begin
PixelsPerInchX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
OffsetX := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
Result:= Round((X / 25.4) * PixelsPerInchX) - OffsetX;
end;

function mmToPixelsY(Y: Real): Integer;
var
PixelsPerInchY: Integer;
OffsetY: Integer;
begin
PixelsPerInchY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
OffsetY := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
Result:= Round((Y / 25.4) * PixelsPerInchY) - OffsetY;
end;

egostar
29-05-2006, 23:48:18
Si, de hecho la cuestion es que hice un pequeño programa que hace eso, pero no pude adjuntarlo porque esta muy grande, si tu puedes ayudarme a agregarlo para que lo vean seria mejor.

Saludos.

egostar
29-05-2006, 23:51:28
Puede que te resulte mas sencillo trabajar en milimetros que en pixels para diseñar tus facturas. Estas funciones te pasan de milimetros a pixels, midiendo los milimetros desde la esquina superior izquierda del papel. Asi solo tienes que diseñarla con un lapiz sobre una hoja de papel y luego utilizar una regla para medir :D


Por cierto, precisamente el diseño es lo que quiero que se evite. Con el programita en cuestion, te da la localizacion exacta para que no tengas que estar probando a prueba y error.

Saludos