Clase tprinter

Post Reply
surGom
Posts: 654
Joined: Wed Oct 19, 2005 12:03 pm
Contact:

Clase tprinter

Post by surGom »

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

Code: Select all | Expand

  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

User avatar
Antonio Linares
Site Admin
Posts: 44515
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Clase tprinter

Post by Antonio Linares »

regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 44515
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Clase tprinter

Post by Antonio Linares »

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: Select all | Expand

// 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: Select all | Expand

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: Select all | Expand

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
surGom
Posts: 654
Joined: Wed Oct 19, 2005 12:03 pm
Contact:

Re: Clase tprinter

Post by surGom »

Muchisimas gracias Antonio

Luis

Post Reply