Imprimir por ambos lados?

Post Reply
User avatar
Armando
Posts: 3382
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Imprimir por ambos lados?

Post by Armando »

Amigos del foro:

Hasta ahora, un cliente me pide imprimir en las dos caras del papel

Entiendo que, nuestra aplicación crea la vista previa y de la capacidad de la impresora depende
la impresión por ambas caras del papel, pero quiero que ustedes me aclaren si estoy equivocado.

Gracias por sus aportes.

Saludos

SOI, s.a. de c.v.
[email protected]
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Antonio Linares
Site Admin
Posts: 44515
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Imprimir por ambos lados?

Post by Antonio Linares »

Estimado Armando,

FiveWin sí proporciona funciones para controlar la impresión duplex (doble cara) desde la aplicación. No es solo cuestión de la impresora.

Funciones disponibles en FiveWin 1. IsDuplexPrinter()

Verifica si la impresora seleccionada soporta impresión a doble cara. Internamente revisa el flag DM_DUPLEX en la estructura DEVMODE del driver:

Code: Select all | Expand

hb_retl( lpDevMode->dmFields & DM_DUPLEX );
2. PrnDuplex( nValue )

Permite obtener y establecer el modo duplex. Si se pasa un parámetro, establece el valor; siempre retorna el valor anterior:

Code: Select all | Expand

HB_FUNC( PRNDUPLEX ) // ( nValue ) --> nOldValue
{
   ...
   dmDuplex = lpDevMode->dmDuplex;
   if( hb_pcount() > 0 )
      lpDevMode->dmDuplex = ( short ) hb_parni( 1 );
   hb_retni( dmDuplex );
   ...
}

Los valores posibles para nValue son las constantes de Windows:

  • DMDUP_SIMPLEX (1) - una sola cara
  • DMDUP_VERTICAL (2) - doble cara, volteo por el borde largo
  • DMDUP_HORIZONTAL (3) - doble cara, volteo por el borde corto
3. DeviceCapabilities() con DC_DUPLEX

También puede consultar las capacidades del dispositivo directamente, como muestra el ejemplo en samples/misc/devcaps.prg:

Code: Select all | Expand

#define DC_DUPLEX  7

if DeviceCapabilities( "Epson Stylus Color", DC_DUPLEX ) == 0
   MsgInfo( "No DC_DUPLEX supported by this driver" )
endif
Resumen

Hay dos condiciones que deben cumplirse:

  1. La impresora debe soportar duplex (hardware). Esto se verifica con IsDuplexPrinter() o DeviceCapabilities().
  2. La aplicación debe activar el modo duplex (software). Esto se hace llamando a PrnDuplex( nValue ) antes de imprimir, y luego ResetDC() para aplicar el cambio al DC de la impresora. 0-cite-3

Un ejemplo de uso sería:

Code: Select all | Expand

PRINT oPrn NAME "Mi Documento" PREVIEW

   if IsDuplexPrinter()
      PrnDuplex( 2 )        // DMDUP_VERTICAL - doble cara borde largo
      oPrn:ResetDC()
   endif

   PAGE
      // ... contenido página 1 ...
   ENDPAGE

   PAGE
      // ... contenido página 2 (se imprimirá al reverso) ...
   ENDPAGE

ENDPRINT

En conclusión: no basta con que la impresora soporte duplex; su aplicación debe indicarle explícitamente al driver que active ese modo usando las funciones que FiveWin ya provee.

regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Armando
Posts: 3382
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Re: Imprimir por ambos lados?

Post by Armando »

Maestro Antonio:

Excelente y muy clara catedra.

Muchas gracias

SOI, s.a. de c.v.
[email protected]
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Post Reply