Impresión directa a impresora en el WEB con aplicaciones GeneXus.
A partir de la versión GX 9.0 (U2) se puede imprimir directamente a impresora con las aplicaciones WEB, a una impresora conectada a la maquina del cliente.
Como se explica en el SAC 20913 y en el SAC 19809
Algunos pasos adicionales para lograr que no se vea el reporte, puede ser.
1) Hay que configurar el GXPrn.ini en el raiz del directorio virtual que se maneja (sige/WEB-INF, por ejemplo).
Asignar un formulario USANDO SOLO MAYUSCULAS a la impresora en el GXPRN.INI.
2) Poner la propiedad "Show printer dialog" en NO
3) Hacer un Reporte/Procedimiento para lista que sea Main, con call protocol http, con la propiedad de "Only to Printer" y con las reglas
printer("FORMULARIO");
output_file('salida','pdf);
4) En los webpanels que se vaya a imprimir directo a la impresora, poner una EmbededPage (EP), un boton imprimir, y el evento asociado a dicho boton.
Event 'Imprimir'
&Text=Link(PImprimir) //Este reporte es el creado en el paso 3
EP.Source=&Text // 'http://localhost:8080/sige/servlet/aimpabonado'
EP.Height=0 //Esto es para que no se vea la Embeded Page
EP.Width=0 //Esto es para que no se vea la Embeded Page
EndEvent
Con eso alcanza para imprimir derecho a una impresora, que tenga el nombre que se especifica en el gxprn.ini y que no se vea el reporte. Tiene como inconveniente que es difícil mostrar un avance del estado de la impresión.
También puede dar algun problema si la invocación al reporte da algún problema, pues puede cancelar por timeout cuando el reporte es muy largo.
En java/tomcat, no es trivial saber bien donde se debe guardar el GXPrn.ini. Una buena opcion es dejar que la aplicación cree dicho archivo la primera vez que corra y luego modificarlo.
Ejemplo de GXPRN.INI, es importante el MODE=0
[General_Config_info]
Version=3
XOffset=0
YOffset=0
CheckPaperSize=0
[FORMULARIO]
Printer=Hp (Frente)
Mode=0
Orientation=1
PaperSize=1
PaperLength=2794
PaperWidth=2159
Scale=100
Copies=0
DefaultSource=15
PrintQuality=600
Color=2
Duplex=1
XOffset=0
YOffset=0
Como se explica en el SAC 20913 y en el SAC 19809
Algunos pasos adicionales para lograr que no se vea el reporte, puede ser.
1) Hay que configurar el GXPrn.ini en el raiz del directorio virtual que se maneja (sige/WEB-INF, por ejemplo).
Asignar un formulario USANDO SOLO MAYUSCULAS a la impresora en el GXPRN.INI.
2) Poner la propiedad "Show printer dialog" en NO
3) Hacer un Reporte/Procedimiento para lista que sea Main, con call protocol http, con la propiedad de "Only to Printer" y con las reglas
printer("FORMULARIO");
output_file('salida','pdf);
4) En los webpanels que se vaya a imprimir directo a la impresora, poner una EmbededPage (EP), un boton imprimir, y el evento asociado a dicho boton.
Event 'Imprimir'
&Text=Link(PImprimir) //Este reporte es el creado en el paso 3
EP.Source=&Text // 'http://localhost:8080/sige/servlet/aimpabonado'
EP.Height=0 //Esto es para que no se vea la Embeded Page
EP.Width=0 //Esto es para que no se vea la Embeded Page
EndEvent
Con eso alcanza para imprimir derecho a una impresora, que tenga el nombre que se especifica en el gxprn.ini y que no se vea el reporte. Tiene como inconveniente que es difícil mostrar un avance del estado de la impresión.
También puede dar algun problema si la invocación al reporte da algún problema, pues puede cancelar por timeout cuando el reporte es muy largo.
En java/tomcat, no es trivial saber bien donde se debe guardar el GXPrn.ini. Una buena opcion es dejar que la aplicación cree dicho archivo la primera vez que corra y luego modificarlo.
Ejemplo de GXPRN.INI, es importante el MODE=0
[General_Config_info]
Version=3
XOffset=0
YOffset=0
CheckPaperSize=0
[FORMULARIO]
Printer=Hp (Frente)
Mode=0
Orientation=1
PaperSize=1
PaperLength=2794
PaperWidth=2159
Scale=100
Copies=0
DefaultSource=15
PrintQuality=600
Color=2
Duplex=1
XOffset=0
YOffset=0
Muy Bueno el aporte. Muy bueno el Blog. También en la ayuda de Genexus hay una utilidad para setear la orientacion del papel, tamaño, etc. The program GxSetFrm that allows the configuration of the INI file is also provided, you may select the form that you wish
ResponderBorrarto configure and then set the desired paper size, orientation and printer.
Gracias por el blog. Saludos, martin.
Martin:
ResponderBorrarMe alegro que te sirviera.
El GXSetFrm sirve para cambiar algunos de los seteos, pero hay veces que es preferible usar el viejo y querido NOTEPAD, para modificar el .INI, pues se pueden hacer "mas cosas" que con editor especifico.
Gracias por el comentario.
Mi problema es que se me imprime con la opción activada "Rotar automáticamente y centrar" de Escala de página, en el dialogo de impresión, y no se como puedo dejar fijada esta opción a Escala de página: Ninguno, para que no se me deforme el documento
ResponderBorrarse me olvidaba, estoy intentandolo en net y no se donde colocar el gxprn.ini
ResponderBorrarexcelente, felicitaciones, una pregunta si yo tengo en un grid varias lineas que quiero imprimir directamente a la impresora como seria el procedimiento. Gracias
ResponderBorrarHola Enrique.
ResponderBorrarMi nombre es Alvaro Hernández y en el lugar donde trabajo estamos intentando imprimir en modo texto, en ambiente web, directamente desde el browser a la impresora del cliente.
Lo hemos intentado, pero todavía no pudimos hacerlo y estamos bastante urgidos.
Usamos la versión 9, generando Java.
Lo hicimos andar en PDF pero como tenemos que imprimir en las máquinas interventoras del tipo que se usan en las redes de cobranza, no se imprime bien, me imagino que porque el PDF se trata como imagen.
Se nos ocurrió hacerlo en modo texto que tendría que funcionar, pero nos da error de compilación en java.
Imaginamos que es en el comando 'print ' porque si le sacamos esos comandos, compila bien.
Obviamente que como le sacamos los print no imprime nada no ?
Hemos visto que se puede imprimir texto en la GX EV. 1 en la impresora local, pero tenés idea si se puede imprimir texto en la versiòn 9 en amb. web en la impresora local?
Te agradecería muchísimo porque nos sería de muchisima ayuda.
Te expreso mis disculpas por molestarte, y espero tu respuesta.
Gracias,
Alvaro
En GX 9.0 se puede impirmir en modo texto sin problemas.
ResponderBorrarQue es lo que no estas pudiendo hacer?
Hola Enrique
ResponderBorrarHola Enrique , estoy trabajando en el trial de genexus x ev2 y nada de lo que publicaste funciona , podrias ayudarme , que estare haciendo mal , el trial genera en c+ y sql
ResponderBorrarMil Gracias
Anonimo:
BorrarPara ayudarte, primero es conveniente que des tu nombre, de forma de poder saber a quien estoy ayudando.
Despues es aconsejable que pongas que problema estas teniendo, o que error te da, para poder entender como se te puede ayudar.
Decir que nada de lo que publique funciona, no permite saber que problema es el que te aqueja.
Hola Enrique te respondi recien pero no se si perdi lo que escribi por las dudas te explico todo lo que me pasa de nuevo.
BorrarMe llamo Andrea
Estoy generando en chsarp y sql y estoy renegando hace dos semanas estoy con una impresion que no tiene que mostrar el dialogo de impresion , tiene que salir directo a la impresora , ya hice de todo incluido tus indicaciones y logre que no muestre el cuadro de dialogo de la impresora en ixplorer en chrome lo sigue mostrando.
Sigo insistiendo con iexplorer y me aperece un mensaje que dice "se esta intentando imprimir el documento Desea permitirlo ?
El archivo gxprn.ini lo uso en el directori bin y tambien lo copie en el directorio web
te paso el archivo que estoy usando ,
General_Config_info]
Version=3
XOffset=0
YOffset=0
CheckPaperSize=0
[ANDREA]
Printer=Ricoh Aficio MP 3500 PCL
Mode=0
Orientation=1
PaperSize=1
PaperWidth= 790
PaperLength= 1169
Scale=100
Copies=1
DefaultSource=15
PrintQuality=600
Color=1
Duplex=1
XOffset=0
YOffset=0
andrea
Andrea:
BorrarLo que queres evitar es que salga el el mensaje "Se esta intentando imprimir el documento?" en Internet Explorer?
O imprimir en Chrome?
Te juro Enrique que hice todo lo que aconsejás pero no logro imprimir. Estoy con GX X Ev 2 U1, Web, Java. En Firefox, no hace nada (solo agrega una entrada en GXPRN.INI si es que no estaba previamente), en Chrome abre un cuadro de diálogo de la impresora; por lo menos me da alguna esperanza el tema es que debo hacerlo andar en Firefox. Las diferencias son: debajo del botón tengo "Reporte1.Source = Consulta.Link(47, 137)" y en el GXPRN.INI no tengo la línea: "Printer=Hp (Frente)" que vos indicás en tu GXPRN.INI.
ResponderBorrarGracias y un abrazo!!!
No tenes porque jurarme nada.. te creo que no te funcione.. :)
BorrarYo lo probe con 9.0, con la Ev2, creo que hay mejoras que lo deberian hacer mas facil.
Por las dudas, en el gxprn.ini, tenes que poner una entrada, que diga en que impresora queres que se imprima.
HP (Frente) es la impresora que teniamos, que era un HP y estaba en el frente de oficina. :)
Vos deberias tener el nombre de la impresora tuya en la cual queres que se imprima.
Con eso, le estas diciendo que cuando use el FORMULARIO use dicha impresora.
Gracias Enrique pero ni poniendo el nombre de la impresora me funciona. De todos modos no creo que sea práctico tampoco hacer eso. Se supone que el reporte debe salir por la predeterminada.
ResponderBorrarHola Enrique mi nombre es Luis Diarte, me pasa lo mismo que a Sergio, yo tengo Gx Ev1 Upgrade 8, hice puntillosamente cada paso que indicas pero me sigue mostrando el PDF y no tira a la impresora
ResponderBorrarQue tal enrique, tengo un problema al imprimir, pero es un tema con el printingappletsigned.jar, ya que al llamar al reporte, me salta un cartel si deseo permitir que se ejecute la aplicacion java, cuando le indico que no bloque nada, en la aplicación genexus me muestra un mensaje diciendo:
ResponderBorrar"No java plugin detected. Click here to download"
El mensaje no me lo muestra en pantalla, ya que lo coloca en una etiqueta div con tamaño 0x0.
Te comento que los reportes deben ser texto, impreso en el lado cliente con una etiquetadora, utilizo GXEvo2 U3, java entorno web.
Alguna vez te pasó esto?
Con esta herramiento puedo mandar a imprimir desde la web a una Impresora Fiscal que está conectada al puerto COM1 ?
ResponderBorrarSi es posible, cómo serían los pasos? Si tienen alguna data y me la pueden enviar al mail, se los agradecería muchisimo, mi mail es edcsuscrib@yahoo.com.ar
Saludos y gracias
No, esto es para imprimir PDF.
BorrarPara escribir en el puerto COM1, podrias hacer un programa en .NET o Java para lograrlo.
Hola
ResponderBorrarEstoy con Genexus 15 y java quiero imprimir en texto en una impresorta lx300 que es donde imprimo todos mis recibos desde otra aplicacion , estoy logrando imprimir pero no me respeta el gxprn.ini , ya que imprime solo si pongo la impresora lx300 como predeterminda , al procedure lo puse con Only to printer y call protocol "Command Line" el gxprn.ini lo engo en las carpetas C:\Program Files\Apache Software Foundation\Tomcat 7.0\temp
C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps
C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\app\WEB-INF
si me pueden ayudar a configurar para que salga en la impresora aunque no sea predeterminada
gracias
Estimado Enrique, apliqué esto y funcionó casi perfecto, imprime, pero cuando retorno del webpanel que contiene la embedded page imprime nuevamente. Intenté mil cosas pero no pude solucionarlo. ¿Te ha pasado eso o tienes idea de cómo se arregla?.
ResponderBorrarSaludos
Raúl
Hola Enrique, recién mandé mi consulta pues me imprime dos veces, cuando entro (voluntario) y cuando salgo (involuntario) , por las dudas estoy trabajando con Gx15, .NET. Otro detalle es que uso I.Explorer pues con Chrome no anda.
ResponderBorrarSaludos
Raúl
Enrique, Buenas tardes. Puedes ayudar con un tema. Necesito imprimir directamente a una impresora Matriz de Punto desde mi aplicación Web. Gx15, .Net.
ResponderBorrarTengo un Procedure Modo Texto, Salida directamente a Impresora, este no envía nada a la cola de impresión.
Saludos y Gracias.
Atte.
Sergio.
Hola Enrique, te planteo mi problema
ResponderBorrarPara un sistema de cobranza imprimo tickets en impresora Epson TM-U220, cada impresora conectada a una PC (USB), instalada con su driver y definida además como impresora genérica de texto de Windows, compartiendo el mismo puerto (ESDPRT001). Esta solución es la única que encontré luego de una ardua búsqueda.
Los tickets son enviados a imprimir sobre la Impresora Genérica, cada operación de cobranza se compone de: descripción e importe por cada boleta de impuesto o servicio, importe total/vuelto, forma de pago (efectivo, tarjeta débito, tarjeta crédito, cheque). Toda esta información se imprime en un solo ticket, al finalizar la impresora corta el papel. Así funciona actualmente.
Me solicitaron cambiar la forma de imprimir, desean imprimir un ticket por cada boleta y un ticket final (con total y forma de pago).
Creé un Procedure (en el que recibo los parámetros de la operación ya registrada), recorro la tabla correspondiente invocando el Procedure-Report para cada boleta, y una última invocación al mismo Procedure-Report para el ticket final. Obviamente el Procedure-Report común a través de parámetros recibidos imprimiría ticket por cada boleta y ticket total según corresponda.
El problema es que NO imprime todos los tickets, imprime SÓLO uno (el último), por ejemplo en una operación donde se cobraron 2 boletas, deberían imprimirse 3 tickets, 1 por cada boleta (2 en este caso) y 1 con el Total/Forma de Pago, en este caso solamente imprime el ticket con Total/Forma de Pago. Probé inhabilitando la impresión de Total/Forma de Pago, y solamente imprime el ticket de la última boleta.
En la cola de impresión SÓLO genera 1 trabajo, pero verificando en …web\PublicTempStorage, se encuentra TODOS los archivos de textos correspondientes a los tickets enviados a imprimir.
A esta altura no se me ocurre como solucionarlo, por lo cual agradeceria me orientes en alguna solución.
Desarrollo con Genexus 15 U10 .NET - SQL 2014
Nunca habia visto ese comportamiento.
BorrarProbaria hacer un unico reporte, que llame a los otros reportes.
De esta forma va a crear solo un reporte, deberia salir sin problemas.
Hola Enrique, gracias por compartir, estoy teniendo un problema y no puedo resolverlo:
ResponderBorrarintente en evo3 y en gx15 ya, trabajo con JAVA.
Tengo un reporte main(tengo entendido que a partir de evo3 no es un requerimiento pero igual intente de las dos maneras) cuyo call protocoll es "http", el output "only to printer", en un web panel puse una EmbeddedPage y en el evento en el source pongo embpage.source = reporte.Link(parm...)
Me trae el reporte en pdf adentro del control pero no lo envia a la impresora.
Tuve que agregar la regla output_file('ticket.pdf','PDF') porque sino me daba errores.
Tengo entendido tambien que desde abril del 2015 ya no se puede usar el gxprn.ini, igual no es problema porque mando todo a la impresora por defecto.
Pero bueno, no puedo imprimir a menos que le diga al visor de pdf que imprima.
Trabajo en chrome y no tengo necesidad de implementar en otro navegador, es una aplicacion para hacer un totem para sacar turnos e imprimir un ticket con el mismo asi que se implementa en una pc con windows que tengo absoluto control sobre lo que esta instalado y no.
Saludos y gracias
Atte. Facundo.
Hola Facundo
BorrarEstoy teniendo el mismo problema que tú
De casualidad lo pudiste resolver?
De antemano muchas gracias.
Saludos.
Hola:
BorrarAlguno resolvio el problema de imprimir pdf directamente sin pasar por la vista previa de Chrome. Desde hace un tiempo te obliga a pasar por la vista previa de chrome y no se puede enviar directamente a la impresora.
De antemano muchas gracias.
Saludos.-
Hola que tal!!
BorrarTenés que crearte un .bat con lo siguiente:
Te escribo un ejemplo del cod!
start chrome.exe --kiosk-printing --silent-print http://myip:8090/MIKB/servlet/login
Saludos!
Mario
Hola enrique
ResponderBorrarHola Enrique, quisiera hacer la impresion directa pero desde un entorno win con Java con Ev3 y hasta el momento no me logra hacer un simple hola mundo
ResponderBorrarBuenas tardes Sr. Almeida, me llamo Carlos Da Rosa, quisiera hacerte una consulta por favor?, estoy trabajando con Gx17, tengo un webpanel y dentro de un evento del mismo, en una parte del código, si se cumple una condición, se debe invocar a un popup para cargar datos, y luego volver nuevamente al objeto llamador, y seguir hasta terminar el código del evento, pero resultase que al invocar al popup, no para el evento, sigue hasta el final teniendo abierto el popup, sabemos que en el ambiente Win, al invocar a un popup en algún lugar dentro de un código, espera a que se cierre el popup y luego continúa. Como podrías codificar esto en el ambiente Web?
ResponderBorrarEjemplo del código en Web:
Sub 'Confirmar'
If &MtoChn = 0
&FlgChn='S'
&IsContinuar = True
Else //aqui se invoca al popup, pero sigue ejecutándose el código debajo de: &Window.Open()
&Window.Object = WCHT039b.Create(&Usuario, &TC1Cod, &IsContinuar)
&Window.Open() //
If &IsContinuar // no respeta el llamado a WCHT039b
&Window.Object = WCHT039c.Create(&Usuario, &TC1Cod, &IsContinuar)
&Window.Open()
EndIf
EndIf
EndEvent//'Confirmar'
Existen muchas diferencias en la forma de ejecutar (y por lo tanto programar) entre WIN y WEB.
BorrarEs bastante dificil plantear soluciones a casos genericos.
En general, en WEB lo que hay que hacer, es verficar antes todas las condiciones y pedir los parametros de entrada y luego llamar al proceso que va a correr sin interrupciones.
No es como Windows que el proceso va a pararse en el medio esperando por el usuario.
Tambien se puede hacer el proceso, llamar a otro webpanel de confirmacion y ahi seguir el proceso si confirma, pero no llamarlo como popup.
Pasar de WIN a WEB, es un cambio de plataforma de ejecucion, que exige cambios en la forma de programar.
Hola Juan luis, no se si solucionaste tu problema, pero una forma como enfrete ese proplema fue utilizando el Web Extension Toolkit, especificamente la API de interaccion
Borrarcon los genexus PopUp, que te permite ejecutar un evento especifico al cierre de un popup.