FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Clase tprinter
Posts: 652
Joined: Wed Oct 19, 2005 12:03 PM
Clase tprinter
Posted: Thu Mar 19, 2026 07:09 PM

Hola a todos
Utilizo la clase tprinter para imprimir con cutewriter y cuando imprimo y sale la ventana para guardar el documento me sale el 煤ltimo directorio que fue usado y necesito que salga en d贸nde yo quiero guardarlo les paso el ejemplo
d贸nde cPath es el directorio d贸nde quiero guardarlo

cPath := oApp:curproga + "retencion provincia.pdf"

oApp:curprogra = k:\fivexhar\

Me lo guarda a retencion provincia.pdf pero si antes se grab贸 en Mis Documentos lo tom谩 por defecto y no en el directorio que le indico

  FUNCTION imprinbrutos(oVar, impresora, cPath )

  local oprn
  local oFont0, oFont1, oFont2, oFont4





  if Empty(oVar:emiarba)
     oVar:emiarba := valstr(oApp:anioarba) + "/" + "00002" + "/" + StrZero(oVar:nNbruto,8)
  endif	

   DEFINE FONT oFont1 NAME "Times New Roman" SIZE 0, 96  bold OF oprn
   DEFINE FONT oFont0 NAME "Times New Roman" SIZE 0, 110  OF oprn
   DEFINE FONT oFont2 NAME "Times New Roman" SIZE 0, 72 OF  oprn
   DEFINE FONT oFont4 NAME "Times New Roman" SIZE .9, 140  BOLD OF oprn



   PRINTER oprn   TO AllTrim( IIF(impresora,oApp:imppre, oApp:imppdf) )    //  PREVIEW

   oprn:cdocument := cPath	
   PAGE
	
   oprn:ImportWMF( "base.emf" )
	

   oprn:CmSay(  3.70, 9.3, oVar:emiarba, oFont4,,(0,240,150) )
   oprn:CmSay(  9.9, 4.8, oVar:cCuit, oFont0,,(0,0,0) )
   oprn:CmSay(  10.7, 12, AllTrim(oVar:napea), oFont0 )
   oprn:CmSay(  12.42, 4.9, Upper(oVar:domi), oFont0 )
   oprn:CmSay(  14.35, 5.5, Upper(oVar:loca), oFont0 )
   oprn:CmSay(  15.25, 5.5, Upper(oVar:pcia), oFont0 )
   oprn:Cmsay(  17.95, 8.2, Transform( oVar:dfecha,"@d"), oFont0 )
   oprn:Cmsay(  18.75, 6.8, Transform( oVar:Totalre, "@e 999,999,999.99"), oFont0 )
   oprn:Cmsay(  19.7, 5.5, valstr(oVar:nPorIB ), oFont0 )
   oprn:Cmsay(  20.5, 6.8, Transform(oVar:nRetib, "@e 9,999,999.99"), oFont0 )


   ENDPAGE

   ENDPRINT


   oFont0:End()
   oFont4:end()
   oprn:end()
   

 return nil

Desde ya muchas gracias por su atenci贸n

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Clase tprinter
Posted: Thu Mar 19, 2026 07:18 PM
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Clase tprinter
Posted: Thu Mar 19, 2026 07:23 PM

El problema es que oprn:cDocument solo establece el nombre del documento en el spooler de Windows, no controla el directorio donde CuteWriter guarda el archivo. Cuando se llama a StartDoc() internamente, solo se pasan 2 parametros (hDC y el nombre del documento), sin pasar la ruta de salida:

Code (prg): Select all Collapse
// source/classes/printer.prg, _StartPage()
StartDoc( ::hDC, ::cDocument )
``` [0-cite-0](#0-cite-0) 

Y en la API de Windows (`printdc.c`), el tercer parametro `lpszOutput` queda en `0` (NULL) cuando no se pasa:

```c
info.lpszOutput  = ( LPSTR ) IF( HB_ISCHAR( 3 ), hb_parc( 3 ), 0 );
``` [0-cite-1](#0-cite-1) 

CuteWriter es un driver de impresora virtual que tiene su propio dialogo de guardar y recuerda el ultimo directorio usado. FiveWin no puede controlar ese comportamiento.

## Soluciones recomendadas

### Opcion 1: Usar "Microsoft Print to PDF" (recomendado)

Windows 10/11 incluye "Microsoft Print to PDF" que SI acepta la ruta de salida. FiveWin ya tiene la funcion `MSPrintToPDF()` que pasa el path como tercer parametro a `StartDoc`:

```prg
StartDoc( hDC, oPrn:cDocument, cFile )  // cFile = ruta completa del PDF
``` [0-cite-2](#0-cite-2) 

Puedes usarlo asi con PREVIEW:

```prg
FUNCTION imprinbrutos(oVar, impresora, cPath)
   local oprn
   local oFont0, oFont1, oFont2, oFont4

   DEFINE FONT oFont1 NAME "Times New Roman" SIZE 0, 96 BOLD OF oprn
   DEFINE FONT oFont0 NAME "Times New Roman" SIZE 0, 110 OF oprn
   DEFINE FONT oFont2 NAME "Times New Roman" SIZE 0, 72 OF oprn
   DEFINE FONT oFont4 NAME "Times New Roman" SIZE .9, 140 BOLD OF oprn

   PRINTER oprn PREVIEW   // usar PREVIEW para capturar en metafiles

   PAGE
      oprn:ImportWMF("base.emf")
      oprn:CmSay(3.70, 9.3, oVar:emiarba, oFont4,, {0,240,150})
      // ... resto de CmSay ...
   ENDPAGE

   ENDPRINTER

   // Ahora generar el PDF en la ruta deseada
   MSPrintToPDF(oprn, cPath, .T.)

   oFont0:End()
   oFont4:End()
   oprn:End()
return nil

Opcion 2: Usar generacion PDF nativa de FiveWin

Pasar el archivo PDF como parametro cFile (7mo parametro) en el constructor de TPrinter: 0-cite-3

Code (prg): Select all Collapse
FUNCTION imprinbrutos(oVar, impresora, cPath)
   local oprn
   local oFont0, oFont1, oFont2, oFont4

   // Activar generacion PDF nativa
   TPrinter():lUseFWPDF := .t.

   DEFINE FONT oFont1 NAME "Times New Roman" SIZE 0, 96 BOLD OF oprn
   DEFINE FONT oFont0 NAME "Times New Roman" SIZE 0, 110 OF oprn
   DEFINE FONT oFont2 NAME "Times New Roman" SIZE 0, 72 OF oprn
   DEFINE FONT oFont4 NAME "Times New Roman" SIZE .9, 140 BOLD OF oprn

   // Pasar cPath como archivo de salida directamente
   PRINTER oprn TO (oApp:imppdf) FILE cPath

   PAGE
      oprn:ImportWMF("base.emf")
      oprn:CmSay(3.70, 9.3, oVar:emiarba, oFont4,, {0,240,150})
      // ... resto de CmSay ...
   ENDPAGE

   ENDPRINT

   oFont0:End()
   oFont4:End()
   oprn:End()
return nil

Opcion 3: Usar HaruPDF

Si tienes la libreria Haru enlazada:

Code (prg): Select all Collapse
TPrinter():lUseHaruPDF := .t.
``` [0-cite-4](#0-cite-4) 

## Resumen

La propiedad `cDocument` **no es la ruta del archivo** - es solo el nombre del documento para el spooler de impresion. CuteWriter ignora este valor para decidir donde guardar. La mejor solucion es dejar de usar CuteWriter y usar las capacidades nativas de FiveWin para generar PDF (`lUseFWPDF`, `lUseHaruPDF`, o `MSPrintToPDF()`), que si permiten controlar la ruta de salida del archivo.
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 652
Joined: Wed Oct 19, 2005 12:03 PM
Re: Clase tprinter
Posted: Thu Mar 19, 2026 07:41 PM

Muchisimas gracias Antonio

Luis

Continue the discussion