clase tpdf

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

clase tpdf

Post by surGom »

Hice un programa utilizando la clase y la verdad me gusto, y una vez que le tome la mano y con la ayuda que hace un tiempo hizo the full con el asunto de las filas pude realizar un informe de cuentas corrientes en pdf. Lo que no logro hacer es que me alinie las columnas de los importes y no le encontre la vuelta si alguien la utiliza me podría ayudar. Queda muy bien salvo el detalle comentado
Les envío el código que utilizé por si a alguien le interesa.

Code: Select all

function creapdfcc(aCcli,nclia,lprove,cNapea,cMail)
local dresult :=  DEHASTA() 
local cImpdos 
local oprn
local nsaldo := 0
local nvalor := 0
local z := 0
 local cPath := "E:\fivehme\" + alltrim(cNapea) +".pdf"
 local oPdf
 local ntotal := 0
  n  := 2.9


 opdf := tpdf():new(cPath)
 TITULO(oPdf)

for z = 1 to len(aCCli)
      if aCCli[z,1] <= dresult[1]
          nsaldo := aCcli[z,5]
      nvalor := z +1
      else
          exit
      endif 
next
titulo1(oPdf ,cnapea,dresult)
 if !empty(nsaldo)
      oPdf:Pdfatsay(("Saldo al: " + dtoc(dresult[1])),cm2dpi(n+=.4 ),cmAncho(3.4))
      oPdf:Pdfatsay(transform(nsaldo,'@E 9,999,999.99'),cm2dpi(n),cmAncho(19))
 endif 

iif(empty(nvalor), nvalor := 1, nvalor)
 for z = nvalor to len(aCCli)
       oPdf:Pdfatsay(transform(aCcli[z,1],"@d"),cm2dpi(n+.4),cmAncho(1)) 
       oPdf:Pdfatsay(substr(oemtoansi(aCcli[z,2]),1,22) ,cm2dpi(n+.4),cmAncho( 3.4))   
  
      if !empty(aCcli[z,3])
              oPdf:Pdfatsay(transform(aCcli[z,3],"@e 999,999.99") ,cm2dpi(n+=.4 ),cmAncho(9 ),.T. )   
       else
              oPdf:Pdfatsay( transform(aCcli[z,4],"@e 999,999.99"),cm2dpi(n+=.4 ),cmAncho(14 ),.T.  )    
       endif
     oPdf:Pdfatsay(transform(aCcli[z,5],'@E 9,999,999.99'),cm2dpi(n ),cmAncho(19),.T. )                 
      //       oPdf:Pdfatsay(StrZero1(aCcli[z,5],12),cm2dpi(n ),cmAncho(19),.T. )  no funciona así
 
       if n >=  25.4  .or. z = len(aCcli) .or. aCcli[z,1] > dresult[2]
            oPdf:Pdfatsay(replicate("_",115),cm2dpi( n+=.4 ),10,.T.)    
        oPdf:Pdfatsay(("Estado de cta. cte. al " + transform(aCcli[z,1],"@d")),cm2dpi( n+=.4 ),cmAncho(3.4),.T.) 
            oPdf:Pdfatsay(transform(aCcli[z,5],'@E 9,999,999.99'),cm2dpi(n ),cmAncho(19))
            oPdf:Pdfatsay(replicate("_",115),cm2dpi( n+=.4 ),10,.T.)  
       if  aCcli[z,1] > dresult[2]
            exit
       endif
       IF z != len(aCcli)
           opdf:Pdfclosepage()
           opdf:Pdfnewpage("A4","P")
               n := 2.2
               titulo1(oPdf, cNapea,dresult)
           oPdf:Pdfatsay(("Estado de cta. cte. al " + transform(aCcli[z,1],"@d")),cm2dpi( n+=.4 ),cmAncho(3.4),.T. )             
               oPdf:Pdfatsay(transform(aCcli[z,5],'@E 9,999,999.99'),cm2dpi(n ),cmAncho(19),.t.)
           endif
       endif*/
    next   


 opdf:Pdfclosepage()
 opdf:pdfclose()
 msginfo("Archivo creado con éxito","Aviso del sistema")

 if !empty(cmail)
    correo(cMail,,("Enviamos resumen de cuenta desde " + transform(dresult[1],"@d") + " hasta " +  transform(dresult[1],"@d") ),"Resumen de cuenta", alltrim(cPath ) )
endif
return .t.
/*******************************************************************************/
STATIC FUNCTION titulo(oPdf)
 opdf:Pdfnewpage("A4","P")

opdf:Pdfimage("e:\tpdf\logoc1.jpg", cm2dpi(2.5), 0,85,66) 
oPdf:Pdfsetfont( "TIMES",   BOLD, 10)
opdf:Pdfatsay("QUÍMICA MEGA SA",cm2dpi( .7 ),100,.T.)
oPdf:Pdfsetfont( "TIMES",NORMAL, 10)
oPdf:Pdfatsay("Matanza 1456/58",cm2dpi( 1.2 ),100,.T.)
oPdf:Pdfatsay("Avellaneda-Pcia Bs As",cm2dpi( 1.6 ),100,.T.)
oPdf:Pdfatsay("T.E.: 4289-2700(Rotativas)",cm2dpi( 2.0 ),100,.T.)
oPdf:Pdfatsay(replicate("_",115),cm2dpi( 2.5 ),10,.T.)
return nil
/*******************************************************************************/
static function titulo1(oPdf, cNapea,dresult)
local ctitu := "RESUMEN DE CUENTA CORRIENTE"
local cDesde := "Desde el:  " + dtoc(dresult[1])
local cHasta :=  "Hasta el:  "  + dtoc(dresult[2])

oPdf:Pdfatsay(ctitu,cm2dpi(n+=.1 ),210)
oPdf:Pdfatsay(cNapea ,cm2dpi(n +=.4),10 )
oPdf:Pdfatsay(cDesde ,cm2dpi(n +=.4), 10)
oPdf:Pdfatsay(cHasta ,cm2dpi(n +=.4),10 )
oPdf:Pdfatsay(replicate("_",115),cm2dpi(n ),10)
return nil

/*******************************************************************************/
User avatar
ruben Dario
Posts: 986
Joined: Thu Sep 27, 2007 3:47 pm
Location: Colombia

Re: clase tpdf

Post by ruben Dario »

Mu gustaria hacer una prueba, tu tienes la clase completa para hacer el ejemplo.
Ruben Dario Gonzalez
Cali-Colombia
rubendariogd@hotmail.com - rubendariogd@gmail.com
surGom
Posts: 624
Joined: Wed Oct 19, 2005 12:03 pm
Contact:

Re: clase tpdf

Post by surGom »

Ruben pdflib.lib esta en la versión de xharbour la puedes usar. Acá te envío el link que en su momento publicó Manuel Mercado
http://www.box.net/shared/qfbeha7cb7, aca está la clase yo lo que hice fue bajarla y compilarla. Pero como te dijhe usando la librería que está en las lib de xharbour y usando los ch que bajes del link que te envíe la podes usar, sin compilarla.

Esta buena para esos informes en los que tenés que enviar resumenes de cta. Te los hace instantaneamente. Yo lo utilizó para generar el estado de cta de los clientes y automáticamente los envía por mail. El único problema que no pude resolver es en las columnas numéricas que me las encolumne del lado derecho, por defecto lo hace centrada, y no le encontré la vuelta. Sería interesante resolver eso y quedaría un pdf limpito. Si me mandas tu mail te envío como queda el archivo.

Espero te sea útil y puedas resolver la alineación de las columnas

Gracias
leondefrancia
Posts: 33
Joined: Tue Jun 08, 2010 3:34 pm
Location: Rosario, Santa Fe. Argentina

Re: clase tpdf

Post by leondefrancia »

Buenos días surGom, observo en el código que luego de generar el pdf lo envías por mail.

if !empty(cmail)
correo(cMail,,("Enviamos resumen de cuenta desde " + transform(dresult[1],"@d") + " hasta " + transform(dresult[1],"@d") ),"Resumen de cuenta", alltrim(cPath ) )
endif


Mi consulta es como lo haces, porque llevo algún tiempo lidiando con ese inconveniente. Verás, genero el pdf a través de PDFCreator pero a la hora de enviarlo como adjunto el correo llega truncado, por lo que al abrirlo dice archivo corrupto, he probado varias sugerencias todas sin éxito.
Desde ya muchas gracias.
Libreria: FWH/FWHX 9.11 25/November/2009
Harbour: Harbour 2.0.0 Beta2
Compilador: Borland C++ 5.5.1 versión 32 bits
Editor de Recursos: UEstudio 10.0
Gestor de B.D: A.D.A ( Advantage Data Architect )
S.O: Windows XP
surGom
Posts: 624
Joined: Wed Oct 19, 2005 12:03 pm
Contact:

Re: clase tpdf

Post by surGom »

Así queda el ejemplo que envíe, lo único feo es la aileación

Image

y otra hoja
Image
surGom
Posts: 624
Joined: Wed Oct 19, 2005 12:03 pm
Contact:

Re: clase tpdf

Post by surGom »

León este enlace lo envío Karinha http://www.fivewin.com.br/exibedicas.asp?id=1063, y es lo que utilizo para enviar los mail. Envío las facturas electrónicas generadas y los listados solicitados. También utilizé el blat (hasta la ayuda de Karinha) y los archivos llegan lo mas bien.
Te aclaro que para la factura electrónica uso el pdfwriter ya que quiero que vean la factura generada y los obligo a guardar el documento manualmente, y luego la envían por mail en lotes.
En el caso de los otros pdf al crearlo por código es rapidísimo y al poner
correo(cMail,,("Enviamos resumen de cuenta desde " + transform(dresult[1],"@d") + " hasta " + transform(dresult[1],"@d") ),"Resumen de cuenta", alltrim(cPath ) )
Es instantáneo

Muestra un diálogo similar al redactar correo del outlook, dónde podes agregar comentarios y enviarlo

Espero te sirva de ayuda.
leondefrancia
Posts: 33
Joined: Tue Jun 08, 2010 3:34 pm
Location: Rosario, Santa Fe. Argentina

Re: clase tpdf

Post by leondefrancia »

Muchisimas gracias, había probado CDOSYS y me sucedía lo mismo, vi que en la función no utiliza el parámetro de timeout, así que probé lo mismo y santo remedio!
Nuevamente muchas gracias!
Libreria: FWH/FWHX 9.11 25/November/2009
Harbour: Harbour 2.0.0 Beta2
Compilador: Borland C++ 5.5.1 versión 32 bits
Editor de Recursos: UEstudio 10.0
Gestor de B.D: A.D.A ( Advantage Data Architect )
S.O: Windows XP
surGom
Posts: 624
Joined: Wed Oct 19, 2005 12:03 pm
Contact:

Re: clase tpdf

Post by surGom »

Disculpen que vuelva sobre el tema, pero no logro hacer la alineación de las columnas numéricas, lo que vi es que si edito el pdf con el notepad, las columnas estan correctas :

Code: Select all

BT 27.42 700.27 Td (19/01/2011) Tj ET
BT 93.23 700.27 Td (Factura     1-00083526) Tj ET
BT 246.78 700.27 Td (   22.599,56) Tj ET
BT 520.98 700.27 Td (  118.854,02) Tj ET
BT 27.42 688.93 Td (09/02/2011) Tj ET
BT 93.23 688.93 Td (Recibo         69684  ) Tj ET
BT 383.88 688.93 Td (   93.570,77) Tj ET
BT 520.98 688.93 Td (   25.283,25) Tj ET
BT 27.42 677.59 Td (09/02/2011) Tj ET
BT 93.23 677.59 Td (Recibo         69999  ) Tj ET
Si utilizó strzero se ubican correctamente pero es horrible la imagen. No encuentro en dónde de los códigos fuentes está la formula para que lo pueda alinear de alguna forma.Modifiqué strzero para que me reemplace por blancos los espacios pero igual los centra. Hay alguna forma de engañar para que me respete los blancos y quede expresado como mas arriba

Gracias
surGom
Posts: 624
Joined: Wed Oct 19, 2005 12:03 pm
Contact:

Re: clase tpdf

Post by surGom »

Bueno lo resolvi gracias a Claudio H que esta suscripto en xharbour spanish portuguese, usando el tipo de letra Courier que es de ancho fijo el listado queda perfecto.
Como puedo saber que fuentes son de ancho fijo

Luis
User avatar
Manuel Valdenebro
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Re: clase tpdf

Post by Manuel Valdenebro »

Luis,

Veo que en tu ejemplo usas la funcion cmAncho. Me imagino que es para calcular el ancho en centimetros, complementaria de la funcion de TheFull para el alto.

¿Podrias publicar aqui esa funcion cmancho? ¿Simplemente ( nCM * 72 / 2.54 ) ?

Muchas gracias
Un saludo

Manuel
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: clase tpdf

Post by karinha »

Gracias, mui bueno ejemplo.

Code: Select all

function cm2dpi( nCM, page, lHeight )
   Local nHeight,nDpi := 72
   Local nRes 

   if empty( lHeight )
      lHeight := .T.
   endif

   if lHeight
      nHeight := 842.0
      nRes := nHeight - ( nCM * nDpi / 2.54 )
   else
      nRes := ( nCM * nDpi / 2.54 )
   endif

return nRes
 
Gracias, saludos.
João Santos - São Paulo - Brasil
Post Reply