PDA

Ver la Versión Completa : No se imprimen algunas imágenes


EGMM
30-07-2010, 17:24:28
Hola:

Tengo un sistema desarrollado en Delphi 5 que está instalado en muchos clientes. Con ese sistema se imprimen muchos formularios. Algunos de ellos tienen 2 o 3 imágenes. Lo que me pasa es que eso anda casi siempre bien pero cada tanto, hay alguna imagen que no se imprime. Es decir que se imprime todo el formulario (texto, recuadros, etc.) y todas las imágenes menos una. Quizás 100 veces anda todo bien y al imprimir el formulario 101 pasa esto, aunque claro que la frecuencia no es constante.

Cuando esto pasa, el usuario simplemente reimprime el formulario (que un minuto antes salió con una imagen menos) y se imprime bien con todas las imágenes.

La impresión se hace usando TPrinter, las imágenes son archivos (JPG o BMP) que se leen en un TImage y se copian al TPrinter.canvas usando StretchDraw.

Esto pasa en más de un cliente (pero no en todos) con diferentes imágenes y diferentes impresoras.

¿Alguna idea de cuál puede ser la causa (y la solución) del problema?

rgstuamigo
03-08-2010, 00:47:48
No sé si te pueda servir hacer un refrescamiento antes de mandar a imprimir::rolleyes:
...
Printer.Canvas.Refresh;//<--;)
...
Pruébalo...
Saludos...:)

EGMM
13-08-2010, 00:02:18
Muchas gracias por tu sugerencia. La voy a probar a ver si funciona.

Saludos

cfernan
18-08-2010, 03:36:29
A mi me ha pasado, y no se sabe cuándo pasa. Según lo que vi, yo uso imágenes BitMap y para imprimir uso Draw. Según la ayuda de Delphi, para imprimir BitMap se debe usar PrinBitMap. En eso estoy.

cfernan
18-08-2010, 03:40:40
Mira esto la página scalabium.com/faq/dct0090.htm

EGMM
21-08-2010, 20:33:37
A mi me ha pasado, y no se sabe cuándo pasa. Según lo que vi, yo uso imágenes BitMap y para imprimir uso Draw. Según la ayuda de Delphi, para imprimir BitMap se debe usar PrinBitMap. En eso estoy.

Yo tengo Delphi 5 y en mi ayuda no está PrintBitMap. ¿Vos qué versión de Delphi tenés?

¿Es un procedure, un método de TPrinter, una función de la API...?

EGMM
21-08-2010, 20:40:55
Mira esto la página scalabium.com/faq/dct0090.htm

Ese mismo método para imprimir está en los siguientes links:

w ww.howtodothings.com/computers/a1102-stretchdraw-an-image-to-a-printer-canvas.html

coding.derkeiler.com/Archive/Delphi/borland.public.delphi.language.objectpascal/2004-01/0338.html

De todos modos ya lo probé y pasa lo mismo, así que lamentablemente esto no soluciona el problema.

cfernan
22-08-2010, 02:48:05
Mira la página scalabium.com/faq/dct0090.htm

Aquí dice cómo hacerlo. Lo probé y funciona OK.

EGMM
24-08-2010, 23:00:47
Mira la página scalabium.com/faq/dct0090.htm

Aquí dice cómo hacerlo. Lo probé y funciona OK.

Me sorprende que digas que es la solución. Yo eso también lo probé y el problema sigue igual. La mayoría de las imágenes se imprime pero de tanto en tanto, alguna imagen no se imprime.

Ojo que a veces pasan varios días seguidos en los que se imprimen todas las imágenes y de repente un día alguna no se imprime.

Jab
25-08-2010, 13:15:28
Hola, a mi esto me pasaba en alguna ocasión y sigue pasándome en un programa, en otro no, como más adelante comento. Por lo que pude observar, se debe a un problema de gestión de memoria entre el SO y la impresora. En un caso, la imagen con el report ocupa memoria mientras se está previsualizando, a veces esta memoria no se gestiona bien y no carga correctamente el dato del bitmap, dando error interno pero sigue continuando el proceso de previsualización, otras daba "metafile is not valid", cuando es la misma imagen en todas las hojas del informe... => memoria. El objeto usado para realizar el informe era el quickreport 3.0.5

Este caso lo solucioné haciendo que el usuario no imprimiera la imagen si así lo deseaba.

En tu caso concreto, dado que lanzas directamente la impresión en el canvas, puedes comprobar la memoria RAM que tienen las impresoras que están realizando la impresión. Prueba a cambiar la configuración de las mismas en "imprimir directamente en impresora", sin usar la cola, es posible que el flujo de datos deje más libertad y pueda cargar la imagen en un momento dado.

Por regla general, las impresoras disponen de una cantidad de MB limitado para controlar el flujo de información y procesarlo. A veces, el flujo no es suficiente para controlar datos, si esa imagen es el último dato en ser enviado, y no cabe, la impresora toma la medida de "mejor imprimir poco que no imprimir nada", e imprime. En otras impresoras darán errores, previamente al S.O. o durante la impresión en su visor LED si lo tuviera, etc.

Otra opción que se me ocurre para saber si esto es así es que pruebes con imágenes pesadas a lanzarlas directamente en impresión en el canvas, observarás que más de una vez, la impresora no imprime todo lo que se le manda. Yo lo tengo comprobado en una aplicación que generaba carteles. Estos carteles se imprimían casi siempre bien, pero cuando el cartel tenía imágenes pesadas a veces no salía el fondo, o no aparecía alguna de las imágenes. Como solución, al usar el freereport, en esta herramientas, cambiamos la imagen de fondo eliminándola y usando los objetos propios del report, además de pedirle al usuario que cuando cargara las imágenes en la base de datos, procediera a redimensionarlas a 1024x768. El problema se solucionó y hasta ahora (ha pasado más de 1 año) los carteles salen todos sin este problema.

Espero que esto te ayude.