FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour No libera la memoria cuando genero pdf
Posts: 244
Joined: Fri Oct 28, 2005 06:29 PM
No libera la memoria cuando genero pdf
Posted: Sat Mar 07, 2009 10:12 PM
Tengo la necesidad de generar 9000 boletas, las tengo TODAS en vista preliminar y el cliente quiere que salgan todas en el mismo proceso.

En oDevice:aMeta estan los nombres de cada emf ( se los asigné yo de antemano ya que requiero de un nombre específico para cada uno )
y necesito generar un pdf por cada archivo ( uso pdfcreator ), por lo que hice las siguiente modificación a Rpreview, agregándole una opcion aparte:

Code (fw): Select all Collapse
         aFiles := oDevice:aMeta
         FOR nFor := 1 TO Len( aFiles )

               cFile := cFileNoPath( aFiles[ nFor ] )
               cFile := cFileNoExt( cFile )
               StartDoc( hDC, cFile )

                    StartPage( hDC )
                    hMeta := GetEnhMetaFile( aFiles[nFor] )
                    PlayEnhMetaFile( hDC, hMeta,, .T. )
                    DeleteMetafile( hMeta )
                    EndPage( hDC )

               EndDoc( hDC )
               SysRefresh()

         NEXT


El tema es que al cabo de unos momentos, los pdf se generan perfectamente pero el sistema no libera memoria y llega hasta ocupar 2 gb de la ram!!!
No entiendo por que no libera memoria. Que otra manera hay de hacerlo??? :-)

Desde ya muchas gracias!
Uso fwh, bcc55, xhb
Alejandro Cebolido

Buenos Aires, Argentina
Posts: 69
Joined: Wed Mar 29, 2006 10:54 PM
Re: No libera la memoria cuando genero pdf
Posted: Sun Mar 08, 2009 02:03 AM

Hola Alejandro, yo creo los pdf directamente asi:

include "FiveWin.ch"

function main()
Local oPdf, nFontPdf

oPdf := tpdf():new( "c:\prueba.pdf", , 612, 792 )

oPdf:pdfSetFont( "COURIER NEW", 0, nFontPdf )

oPdf:Pdfnewpage( "LETTER", "P" )

oPdf:Pdfatsay( "linea 1", 700, 25, .t. )
oPdf:Pdfatsay( "linea 2", 600, 25, .t. )
oPdf:Pdfatsay( "linea 3", 500, 25, .t. )
oPdf:Pdfatsay( "linea 4", 400, 25, .t. )

oPdf:Pdfclosepage()
oPdf:pdfclose()

SHELLEXECUTE( 0, 0, "c:\prueba.pdf", 0, 0, 1 )

return nil

Si crees que esto te puede ayudar descarga este ejemplo de:

http://www.megaupload.com/?d=2PJZDH1D

Saludos

Alvaro Urdaneta

Saludos



Alvaro Urdaneta



Fwh 25.09, xharbour1.3.1, bcc77, Brw45

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: No libera la memoria cuando genero pdf
Posted: Sun Mar 08, 2009 08:42 AM

Alejandro,

> necesito generar un pdf por cada archivo ( uso pdfcreator ),

Como los creas con pdfcreator ?

Por favor muéstranos el código que usas para crearlos, gracias

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 244
Joined: Fri Oct 28, 2005 06:29 PM
Re: No libera la memoria cuando genero pdf
Posted: Sun Mar 08, 2009 01:17 PM
Antonio:

Las facturas son creadas con un objeto de TPrinter standard
PRINT oPrn TITLE "FACTURAS" PREVIEW

Para el caso, es lo mismo que sean facturas u páginas de un reporte cualquiera.
Lo que necesito es que en la misma tanda de impresion, cualquiera sea el origen de los datos TPrinter o TReport,
imprimir de a una cada página ( son como 9000 ) y enviarlas a la impresora virtual PdfCreator, para que
éste me genere un archivo PDF por cada página, repito: es indistinto si es un reporte u otro tipo de impresion.

Como expuse en el código al inicio del post, use como modelo las lineas de código de RPreview que se utilizan para imprimir una sola página, pero
este procedimiento utlizado en forma repetitiva, se come la memoria y no la libera y llega a consumir mas de 2gb!

Sé que existe la clase TPDF, la probé y funciona perfecto pero no se me ocurre como enviar un reporte normal a esa clase.
Inlcusive hice pruebas convirtiendo el .emf a .jpg con un utilitario cualquiera y luego leventando el archivo con la clase TPdf y
el archivo resultante, si bien es de excelente calidad, el PDF creado en vez de tener 44kb como los que me hace PdfCreator, tiene 270kb que por
9000 archivos, es imposible de manejar.
Para las facturas la clase TPDF no me sirve por que es un diseño muy intrincado y además tiene el problema que no acepta insertar una imagen .emf, solo jpg, tiff o png y en todo caso, tendria que convertir los .emf y no tengo idea de con que hacerlo.

La verdad es que estoy desconcertado. Antonio, alguna idea????

Desde ya, muchisimas gracias.
Alejandro Cebolido

Buenos Aires, Argentina
Posts: 244
Joined: Fri Oct 28, 2005 06:29 PM
Re: No libera la memoria cuando genero pdf
Posted: Mon Mar 09, 2009 07:55 PM

Alguna idea?
Alguien?

Muchas gracias!

Alejandro Cebolido

Buenos Aires, Argentina
Posts: 58
Joined: Tue Mar 11, 2008 03:18 AM
Re: No libera la memoria cuando genero pdf
Posted: Mon Mar 09, 2009 08:16 PM

Traté de hacer uso de:
HB_GCALL(.T.)

Posts: 244
Joined: Fri Oct 28, 2005 06:29 PM
Re: No libera la memoria cuando genero pdf
Posted: Mon Mar 09, 2009 10:30 PM

He utlilizado HB_GCALL() con el mismo resultado, pero no se para que sive con .T.

Saludos!

Alejandro Cebolido

Buenos Aires, Argentina
Posts: 58
Joined: Tue Mar 11, 2008 03:18 AM
Re: No libera la memoria cuando genero pdf
Posted: Tue Mar 10, 2009 02:19 PM
Veja o que diz o Help do xHarbour:
HB_GCAll()
Scans the memory and releases all garbage memory blocks.

Syntax
HB_GCAll( [<lForce>] ) --> NIL

Arguments
<lForce>
Passing .T. (true) enforces a complete garbage collection, even if there are only few memory objects to collect. If <lForce> is omitted, or set to .F. (false), the garbage collector is not invoked when there is little or no garbage to collect. Return
The return value is always NIL.

Description
xHarbour's garbage collector is normally invoked automatically during idle states. An idle state is the state of the xHarbour virtual machine (VM) when it waits for user input from the keyboard or the mouse. The VM enters idle state during Inkey() calls. All applications that do not use Inkey() function calls can signal the idle state with a call to the HB_IdleState() function.
Alternatively, garbage collection can be enforced programmatically with HB_GCAll(.T.). This can be advantageous when there is massive use of memory during a loop, for exemple, that includes no user input and no idle state is signalled.

Continue the discussion