Page 1 of 1

Imprimir por ambos lados?

Posted: Sat May 09, 2026 7:39 pm
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


Re: Imprimir por ambos lados?

Posted: Sat May 09, 2026 8:04 pm
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.


Re: Imprimir por ambos lados?

Posted: Sun May 10, 2026 3:25 am
by Armando

Maestro Antonio:

Excelente y muy clara catedra.

Muchas gracias