Imprimir directamente en una impresora matricial ESPON

28/04/2005 - 19:26 por Oriol | Informe spam
Hola a todos,

Estoy desarrollando una aplicacion Winforms en C# y estoy intentando
imprimir de forma directa a una impresora matricial EPSON. Digo de forma
directa porque no puedo pasar por CrystalReports y necesito hacerlo asi.

He encontrado ejemplos que utilizan algun sistema como la "winspool.drv" y
otros con System.Drawing, pero no consigo imprimir correctamente. Debo
definir un tamaño un poco no estandar (no es un A4 ni folio) y ademas,
rellenar unos campos del impreso que estan en posiciones concretas.

Me interesaria saber como puedo imprimir una pagina directamente en una
EPSON matricial (que supongo que ira en filas y columnas aun y no con puntos
o dots).

Cualquier ayuda sera bienvenida, y si tienen algun ejemplo de como hacerlo,
seria de gran ayuda.

Gracias de antemano.

Saludos,
Oriol Sala.

Preguntas similare

Leer las respuestas

#6 Leonardo
03/05/2005 - 13:52 | Informe spam
No entiendo la necesidad de imprimir directamente a la impresora si no es
por compatibilidad
con versiones de programas antiguos que no podemos o no queremos comvertir
ya que el
esfuerzo de controlar los caracteres de control necesarios para establecer
orientación, fuentes,
etc es bastante grande.

Si hago una impresión a fichero con un programa, en las primeras posiciones
del fichero,
encuentro los caracteres de escape específicos de la impresora que
determinan las propiedades
de impresión. Estos caracteres se pueden ver con un editor hexadecimal.

En el manual de la impresora, en los apéndices está la información de los
caracteres
de escape o control.

Saludos
Leonardo.


"Oriol" <intranet[arroba]rvsa-itv.com> escribió en el mensaje
news:
Hola Leonardo,

Vaya curro te has metido con este mail!!!

Te comento, de momento consegui imprimir en la impresora lo que necesito,


es
decir, unos sobres con los datos de los clientes. Todo funciona ok, pero


el
problema es el que comentas al final de tu mail, y es el juego de
caracteres. No me imprime las Ñ ni los acentos. Tengo como mapa de
caracteres el ANSI. Trabajo en C#/WinForms/WinXP.

Alguna opcion de cambiar el CharSet? En C# solo me permite ANSI/UNICODE.

Saludos,
Oriol.

"Leonardo" escribió en el mensaje
news:
> En MsDos, usabamos el comando Copy Filename Lpt1:
> y funcionaba.
>
> Desde programa en C
> CopyFile((LPCTSTR)fichero,(LPCTSTR)Puerto,FALSE);
>
> Funciona casi siempre. Las excepciones se deben en general a la
> configuración del puerto en los ordenadores más nuevos.
> Funciona en general para impresoras de red siempre y cuando se configure
> la
> conexión para soportar impresión desde MsDos.
>
> Para obtener la dirección del "Puerto", en las news plantean leerlo de
> win.ini, pero esta opción da resultados distintos en función
> del sistema operativo (Win95 / Xp).
> Más fiable el diálogo de imresora:
>
> PRINTDLG Pd;
> char *Names;
>
> memset(&Pd, 0, sizeof(Pd));
> Pd.lStructSize = sizeof(Pd);
> Pd.Flags = 0x400; //(DefaultPrinter)
> if(!PrintDlg(&Pd)) return;
>
> Names = GlobalLock(Pd.hDevNames);
> Puerto = Names + ((DEVNAMES *)(Names))->wDeviceOffset ;
> if (Puerto[0]!='\\' || Puerto[1]!='\\') //El dispositivo no es un serv.


de
> impresión en red
> Puerto = Names + ((DEVNAMES *)(Names))->wOutputOffset ; //


Tomamos
> el puerto
>
>
> Para un mayor control de la impresión, sustituyo CopyFile por mi propia
> función:
>
> static void PrintFile(LPCTSTR fichero,LPCTSTR pr)
> { char bf[4096];
> int f, fprn, r, l, tiempo=0, ErrCode;
> LPVOID lpMsgBuf;
>
> if((f = open(fichero, _O_RDONLY)) == -1){
> ShowError( fichero );
> return;
> }
>
> reintentar: // Si está la impresora ocupada...
> if((fprn = open(pr,_O_WRONLY)) == -1){
> ErrCode = GetLastError();
> if (tiempo<60 && ErrCode==5) { Sleep(5000); tiempo+=5; goto
> reintentar; }
> FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
> FORMAT_MESSAGE_FROM_SYSTEM, NULL,
> ErrCode,
> MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default
> language
> (LPTSTR) &lpMsgBuf, 0, NULL );// Display the
> string.
> r = MessageBox( NULL, lpMsgBuf, pr,


MB_RETRYCANCEL|MB_ICONEXCLAMATION);
> if (r== IDRETRY) { tiempo=0; goto reintentar; }
> }
> if( fprn != -1) {
> while(!eof(f))
> { l = read(f,bf,sizeof(bf));
> if(l>0) write(fprn,bf,l);
> }
>
> close(fprn); }
> close(f);
> }
>
> En Net, es más sencillo puesto que la clase PinterSettings incluye casi
> todo
> lo que necesitamos. Pero se complica con los temas de
> seguridad que limitan a usuarios sin privilegios de administrador el uso
> de
> algunas funciones de impresión / Spool.
>
> -
>
> Problemas con el juego de caracteres.
>
> En MsDos, usábamos el juego de caracteres OEM que permitía dibujar


líneas
> y
> recuadros en la impresora. Puesto que en pantalla también usábamos el
> mismo
> juego de caracteres, la cosa iba bien.
>
> En Windows, usamos un juego de caracteres ANSI que no incluye los
> caracteres
> de dibujo de IBM y en el cual la ñ, los caracteres acentuados etc, no
> coinciden con
> el juego de caracteres OEM.
>
> Si no usamos los caracteres de IBM, se puede modificar la cadena de
> inicialización de la impresora (en el fichero a enviar) para que trabaje
> con
> el juego de caracteres
> apropiado, pero en general este no es el caso.
>
> En su día, opté por crearme un programa con MFC apoyado en


Vista/documento
> que soporta Print Preview y que transforma en recuadros y líneas los
> caracteres de
> IBM. Con esta solución, ya sí que salían correctamente los caracteres
> acentuados y nacionales.
>
> -
>
>
> "Oriol" <intranet[arroba]rvsa-itv.com> escribió en el mensaje
> news:
>> Hola a todos,
>>
>> Estoy desarrollando una aplicacion Winforms en C# y estoy intentando
>> imprimir de forma directa a una impresora matricial EPSON. Digo de


forma
>> directa porque no puedo pasar por CrystalReports y necesito hacerlo


asi.
>>
>> He encontrado ejemplos que utilizan algun sistema como la


"winspool.drv"
>> y
>> otros con System.Drawing, pero no consigo imprimir correctamente. Debo
>> definir un tamaño un poco no estandar (no es un A4 ni folio) y ademas,
>> rellenar unos campos del impreso que estan en posiciones concretas.
>>
>> Me interesaria saber como puedo imprimir una pagina directamente en una
>> EPSON matricial (que supongo que ira en filas y columnas aun y no con
> puntos
>> o dots).
>>
>> Cualquier ayuda sera bienvenida, y si tienen algun ejemplo de como
> hacerlo,
>> seria de gran ayuda.
>>
>> Gracias de antemano.
>>
>> Saludos,
>> Oriol Sala.
>>
>>
>
>


Respuesta Responder a este mensaje
#7 Oriol
03/05/2005 - 16:10 | Informe spam
Hola Leonardo,

La necesidad de imprimir directamente a la impresora no me vienen impuestos,
sino que es la unica solucion que he encontrado a la impresion en papel
continuo de unas facturas. Lo he intentado en Crystal Reports pero no
consigo que encajen porque el papel continuo no lo contempla. Asi que lo
intente directamente sobre la impresora porque asi puedo controlarlo mejor.
Ejemplo de eso es que aun imprimiendo 1000 hojas, esta no descuadra y sigue
imprimiendo en su sitio, y con reports, me descuadraba a la primera/segunda
hoja. Aparte de que no encontre como indicarle al Crystal que utilize Papel
continuo.

Pero despues de la ilusion de comprovar que imprimia correctamente en su
sitio, me encontre que no salian los acentos ni caracteres regionales (ñ,ç,
etc).

Si encontrase otra forma de hacerlo, lo haria, pero no la he encontrado.
Comento que estoy utilizando VS2003, programando una aplicacion Winforms en
C#, WinXP y una impresora EPSON FX880+.

Tambien he leido los manuales, pero la impresora no me hace caso. Leí por
alli que en Windows no funcionan estos comandos.

Se te ocurre alguna cosa mas o algo que pueda probar???

Gracias ya de antemano por todo.

Saludos,
Oriol.

"Leonardo" escribió en el mensaje
news:
No entiendo la necesidad de imprimir directamente a la impresora si no es
por compatibilidad
con versiones de programas antiguos que no podemos o no queremos comvertir
ya que el
esfuerzo de controlar los caracteres de control necesarios para establecer
orientación, fuentes,
etc es bastante grande.

Si hago una impresión a fichero con un programa, en las primeras
posiciones
del fichero,
encuentro los caracteres de escape específicos de la impresora que
determinan las propiedades
de impresión. Estos caracteres se pueden ver con un editor hexadecimal.

En el manual de la impresora, en los apéndices está la información de los
caracteres
de escape o control.

Saludos
Leonardo.


"Oriol" <intranet[arroba]rvsa-itv.com> escribió en el mensaje
news:
Hola Leonardo,

Vaya curro te has metido con este mail!!!

Te comento, de momento consegui imprimir en la impresora lo que necesito,


es
decir, unos sobres con los datos de los clientes. Todo funciona ok, pero


el
problema es el que comentas al final de tu mail, y es el juego de
caracteres. No me imprime las Ñ ni los acentos. Tengo como mapa de
caracteres el ANSI. Trabajo en C#/WinForms/WinXP.

Alguna opcion de cambiar el CharSet? En C# solo me permite ANSI/UNICODE.

Saludos,
Oriol.

"Leonardo" escribió en el mensaje
news:
> En MsDos, usabamos el comando Copy Filename Lpt1:
> y funcionaba.
>
> Desde programa en C
> CopyFile((LPCTSTR)fichero,(LPCTSTR)Puerto,FALSE);
>
> Funciona casi siempre. Las excepciones se deben en general a la
> configuración del puerto en los ordenadores más nuevos.
> Funciona en general para impresoras de red siempre y cuando se
> configure
> la
> conexión para soportar impresión desde MsDos.
>
> Para obtener la dirección del "Puerto", en las news plantean leerlo de
> win.ini, pero esta opción da resultados distintos en función
> del sistema operativo (Win95 / Xp).
> Más fiable el diálogo de imresora:
>
> PRINTDLG Pd;
> char *Names;
>
> memset(&Pd, 0, sizeof(Pd));
> Pd.lStructSize = sizeof(Pd);
> Pd.Flags = 0x400; //(DefaultPrinter)
> if(!PrintDlg(&Pd)) return;
>
> Names = GlobalLock(Pd.hDevNames);
> Puerto = Names + ((DEVNAMES *)(Names))->wDeviceOffset ;
> if (Puerto[0]!='\\' || Puerto[1]!='\\') //El dispositivo no es un serv.


de
> impresión en red
> Puerto = Names + ((DEVNAMES *)(Names))->wOutputOffset ; //


Tomamos
> el puerto
>
>
> Para un mayor control de la impresión, sustituyo CopyFile por mi propia
> función:
>
> static void PrintFile(LPCTSTR fichero,LPCTSTR pr)
> { char bf[4096];
> int f, fprn, r, l, tiempo=0, ErrCode;
> LPVOID lpMsgBuf;
>
> if((f = open(fichero, _O_RDONLY)) == -1){
> ShowError( fichero );
> return;
> }
>
> reintentar: // Si está la impresora ocupada...
> if((fprn = open(pr,_O_WRONLY)) == -1){
> ErrCode = GetLastError();
> if (tiempo<60 && ErrCode==5) { Sleep(5000); tiempo+=5; goto
> reintentar; }
> FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
> FORMAT_MESSAGE_FROM_SYSTEM, NULL,
> ErrCode,
> MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default
> language
> (LPTSTR) &lpMsgBuf, 0, NULL );// Display the
> string.
> r = MessageBox( NULL, lpMsgBuf, pr,


MB_RETRYCANCEL|MB_ICONEXCLAMATION);
> if (r== IDRETRY) { tiempo=0; goto reintentar; }
> }
> if( fprn != -1) {
> while(!eof(f))
> { l = read(f,bf,sizeof(bf));
> if(l>0) write(fprn,bf,l);
> }
>
> close(fprn); }
> close(f);
> }
>
> En Net, es más sencillo puesto que la clase PinterSettings incluye casi
> todo
> lo que necesitamos. Pero se complica con los temas de
> seguridad que limitan a usuarios sin privilegios de administrador el
> uso
> de
> algunas funciones de impresión / Spool.
>
> -
>
> Problemas con el juego de caracteres.
>
> En MsDos, usábamos el juego de caracteres OEM que permitía dibujar


líneas
> y
> recuadros en la impresora. Puesto que en pantalla también usábamos el
> mismo
> juego de caracteres, la cosa iba bien.
>
> En Windows, usamos un juego de caracteres ANSI que no incluye los
> caracteres
> de dibujo de IBM y en el cual la ñ, los caracteres acentuados etc, no
> coinciden con
> el juego de caracteres OEM.
>
> Si no usamos los caracteres de IBM, se puede modificar la cadena de
> inicialización de la impresora (en el fichero a enviar) para que
> trabaje
> con
> el juego de caracteres
> apropiado, pero en general este no es el caso.
>
> En su día, opté por crearme un programa con MFC apoyado en


Vista/documento
> que soporta Print Preview y que transforma en recuadros y líneas los
> caracteres de
> IBM. Con esta solución, ya sí que salían correctamente los caracteres
> acentuados y nacionales.
>
> -
>
>
> "Oriol" <intranet[arroba]rvsa-itv.com> escribió en el mensaje
> news:
>> Hola a todos,
>>
>> Estoy desarrollando una aplicacion Winforms en C# y estoy intentando
>> imprimir de forma directa a una impresora matricial EPSON. Digo de


forma
>> directa porque no puedo pasar por CrystalReports y necesito hacerlo


asi.
>>
>> He encontrado ejemplos que utilizan algun sistema como la


"winspool.drv"
>> y
>> otros con System.Drawing, pero no consigo imprimir correctamente. Debo
>> definir un tamaño un poco no estandar (no es un A4 ni folio) y ademas,
>> rellenar unos campos del impreso que estan en posiciones concretas.
>>
>> Me interesaria saber como puedo imprimir una pagina directamente en
>> una
>> EPSON matricial (que supongo que ira en filas y columnas aun y no con
> puntos
>> o dots).
>>
>> Cualquier ayuda sera bienvenida, y si tienen algun ejemplo de como
> hacerlo,
>> seria de gran ayuda.
>>
>> Gracias de antemano.
>>
>> Saludos,
>> Oriol Sala.
>>
>>
>
>






Respuesta Responder a este mensaje
#8 Leonardo
03/05/2005 - 17:11 | Informe spam
Con Notepad escribe la plabra "Prueba"
Mándalo imprimir a la impresora Epson
con la opción imprimir a fichero "prueba.prn"

Abre el fichero con un editor con capacidad de manejar
datos en formato hexadecimal Ej.: Ultraedit, hexworkshop
Elimina desde donde pone "Prueba" hasta el final
(estará en Unicode P.r.u.e.b.a siendo los puntos el chr 0x00)

Prueba en tu programa a leer en un array de bytes el fichero truncado
y envíalo a la impresora como primera cadena

Para hacerlo, tendrás que añadir al código de RawPrinterHelper
alguna función que envíe un array de bytes.

Que tengas suerte.
Leonardo



"Oriol" <intranet[arroba]rvsa-itv.com> escribió en el mensaje
news:%2371xUn%
Hola Leonardo,

La necesidad de imprimir directamente a la impresora no me vienen


impuestos,
sino que es la unica solucion que he encontrado a la impresion en papel
continuo de unas facturas. Lo he intentado en Crystal Reports pero no
consigo que encajen porque el papel continuo no lo contempla. Asi que lo
intente directamente sobre la impresora porque asi puedo controlarlo


mejor.
Ejemplo de eso es que aun imprimiendo 1000 hojas, esta no descuadra y


sigue
imprimiendo en su sitio, y con reports, me descuadraba a la


primera/segunda
hoja. Aparte de que no encontre como indicarle al Crystal que utilize


Papel
continuo.

Pero despues de la ilusion de comprovar que imprimia correctamente en su
sitio, me encontre que no salian los acentos ni caracteres regionales


(ñ,ç,
etc).

Si encontrase otra forma de hacerlo, lo haria, pero no la he encontrado.
Comento que estoy utilizando VS2003, programando una aplicacion Winforms


en
C#, WinXP y una impresora EPSON FX880+.

Tambien he leido los manuales, pero la impresora no me hace caso. Leí por
alli que en Windows no funcionan estos comandos.

Se te ocurre alguna cosa mas o algo que pueda probar???

Gracias ya de antemano por todo.

Saludos,
Oriol.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida