Generación PDF's con Foxypreviewer - Error de memoria

454 views
Skip to first unread message

Comprobante Electronico

unread,
Aug 19, 2019, 1:34:47 PM8/19/19
to Comunidad de Visual Foxpro en Español
Estimados, abro un nuevo hilo porque veo que muchos después de insistir en mas pruebas, muchos han determinado que al generar PDFs con el  FoxPreviewer  hace  que se incremente la memoria, cuando es una cantidad pequeña no se nota, pero cuando se genera mas de 200 pdfs en un proceso automatico ( en mi caso un proceso para generacion de comprobantes electronicos) , la asignacion de memoria a la aplicacion se incrementa.

Alguna idea del porque o como liberarlo? el codigo usado es el siguiente:

NOTA: Se uso tambien un procedimiento liberarmemoria(), lo cual reduce la memoria en uso, mas no la memoria asignada.

FORMA 1
*---
SET PROCEDURE TO LOCFILE("FoxyPreviewer.App") ADDITIVE 
LOCAL loReport as "PreviewHelper" OF "FoxyPreviewer.App" 
loReport = CREATEOBJECT("PreviewHelper") 
WITH loReport as ReportHelper 
 .AddReport(cReporte, "NODIALOG") 
 .cDestFile = nom&&"c:\Teste1.pdf"  && Use para crear una salida din vista previa
 .RunReport() 
ENDWITH 
loReport = .NULL. 
_oReportOutput = .NULL.
release _oReportOutput
removeproperty(_Screen,'oFoxyPreviewer')


FORMA 2 
DO foxypreviewer.app
*report form &cReporte object type 20 to file nom preview
REPORT FORM &cReporte OBJECT TYPE 10 TO FILE &nom
do foxypreviewer.app with "RELEASE"  && .App
_oReportOutput = .NULL.
release _oReportOutput
removeproperty(_Screen,'oFoxyPreviewer')

Ambos tienen los mismos resultado de incrementar la asignación de memoria. 

ZeRoberto

unread,
Aug 19, 2019, 1:40:56 PM8/19/19
to publicesvfoxpro
Cuanto de memoria tienes? y cuantos pdf generas?, yo tengo 8gb he hice la prueba con unos 25 pdfs y la verdad que la memoria ni se movio, asegurate de que tienes la ultima version del FoxyPreviewer.

Saludos

Ze




--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/7138057e-dea5-47d2-8964-fd81fa8e60b7%40googlegroups.com.

ZeRoberto

unread,
Aug 19, 2019, 1:44:01 PM8/19/19
to publicesvfoxpro
Aca te dejo el link para que  te bajes la ultima version


Saludos

Ze 


El lun., 19 de ago. de 2019 a la(s) 12:34, Comprobante Electronico (richard...@gmail.com) escribió:
--

Lulux

unread,
Aug 19, 2019, 2:13:34 PM8/19/19
to Comunidad de Visual Foxpro en Español
Gracias por tu atención, acabo de probar la nueva versión y persiste el problema, tengo 16gb y se generan 3 mil comprobantes diarios, el incremento es aprox 7kb por comprobante, 
Es importante precisar, que el espacio de trabajo en memoria siempre es baja, pero la asignación se incrementa, llegando a un punto donde de queda sin memoria, te envio un pantallazo del monitoreo de la aplicacion, notar la diferencia entre Asignacion y espacio de trabajo

image.png

ZeRoberto

unread,
Aug 19, 2019, 2:20:56 PM8/19/19
to publicesvfoxpro
Puedes mostrar como es tu proceso de generacion?

Local loReport, loQRCode, lnRecno  
Set Procedure To FoxyPreviewer.App
Do While Not Eof()
    loQRCode = NewObject("uo_QRCode", This.ClassLibrary)
   _QRCodePicture = loQRCode.Create(This.QRCode)
    loReport = CreateObject("PreviewHelper")
    With loReport As ReportHelper
         .AddReport(This.FileNameFRX, "NODIALOG")
         .cDestFile = ForceExt(This.FileNameXML, "PDF")
         .RunReport()
    EndWith
   loReport = Null
   Release loReport, loQRCode, _QRCodePicture
EndDo

Lulux

unread,
Aug 19, 2019, 2:30:36 PM8/19/19
to Comunidad de Visual Foxpro en Español
cReporte="rep_E-bole.frx"
nom="C:\CPE\.......PDF" && NOMBRE INDIVIDUAL POR CADA COMPROBANTE

DO foxypreviewer.app

REPORT FORM &cReporte OBJECT TYPE 10 TO FILE &nom
do foxypreviewer.app with "RELEASE"  && .App
_oReportOutput = .NULL.
release _oReportOutput
removeproperty(_Screen,'oFoxyPreviewer')  

Lulux

unread,
Aug 19, 2019, 2:32:55 PM8/19/19
to Comunidad de Visual Foxpro en Español
cReporte="rep_E-bole.frx"
nom="C:\CPE\.......PDF" && NOMBRE INDIVIDUAL POR CADA COMPROBANTE
DO foxypreviewer.app
*report form &cReporte object type 20 to file nom preview
REPORT FORM &cReporte OBJECT TYPE 10 TO FILE &nom
do FoxyPreviewer with "RELEASE"  && .App

     
      _oReportOutput = .NULL.
      release _oReportOutput
     
      *_Screen.oFoxyPreviewer=.null.
      removeproperty(_Screen,'oFoxyPreviewer')

Mary

unread,
Aug 19, 2019, 3:50:17 PM8/19/19
to Comunidad de Visual Foxpro en Español
use SYS(3050) function

alonso mevaz

unread,
Aug 19, 2019, 5:25:13 PM8/19/19
to Comunidad de Visual Foxpro en Español

esto no libera algo que ya es null:

_oReportOutput = .NULL.
release _oReportOutput

deberia ser

release _oReportOutput
_oReportOutput = .NULL.


saludos

El lunes, 19 de agosto de 2019, 12:34:47 (UTC-5), Comprobante Electronico escribió:

Germán Fabricio Valdez

unread,
Aug 19, 2019, 5:41:24 PM8/19/19
to Comunidad de Visual Foxpro en Español
esta instruccion, cuantas veces la usas

SET PROCEDURE TO LOCFILE("FoxyPreviewer.App") ADDITIVE 

tal vez  "ADDITIVE" es el problema 

Comprobante Electronico

unread,
Aug 19, 2019, 7:46:37 PM8/19/19
to Comunidad de Visual Foxpro en Español
Lo uso cada vez que se genera el reporte, como deberia ponerlo?

Saludos

Germán Fabricio Valdez

unread,
Aug 19, 2019, 8:05:36 PM8/19/19
to Comunidad de Visual Foxpro en Español
Solo una vez al inicio de tu prg. 

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este tema, visita https://groups.google.com/d/topic/publicesvfoxpro/BMX6oYoB5ow/unsubscribe.
Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/9c729321-fce9-47a4-9a0f-8adfb44a0628%40googlegroups.com.

Fernando Mora

unread,
Aug 19, 2019, 8:30:04 PM8/19/19
to Comunidad de Visual Foxpro en Español
Yo uso FoxyPreviewer para crear mis PDF, en mi aplicación al final del día los usuarios envían a autorizar al SRI los comprobantes. Se generan masiva los PDF y se envían por correo electrónico al cliente, tengo usuarios que emiten mas de mil facturas al día, y ninguno me ha reportado ese inconveniente. Lo que me hace pensar que el problema puede ser lo que indica German Valdez. No puedes cargar la librería cada vez que vas a genera un PDF, debes cargarla al inicio de tu aplicación, una sola llamada. 
Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a publice...@googlegroups.com.

Comprobante Electronico

unread,
Aug 23, 2019, 9:13:52 PM8/23/19
to Comunidad de Visual Foxpro en Español
Estoy llegando a varias conclusiones, puede ser por el sistema operativo de 64 bits, uso para liberar el siguiente codigo: 

  DECLARE INTEGER SetProcessWorkingSetSize ;
    IN kernel32 AS SetProcessWorkingSetSize ;
    INTEGER hProcess , ;
    INTEGER dwMinimumWorkingSetSize , ;
    INTEGER dwMaximumWorkingSetSize
  
  DECLARE INTEGER GetCurrentProcess ;
    IN kernel32 AS GetCurrentProcess
  nProc = GetCurrentProcess()
  bb = SetProcessWorkingSetSize(nProc,-1,-1)

Pero solo libera la "memoria virtual" - Espacio de trabajo, pero no la memoria asignada, alguna idea para aplicar este codigo para 64 bits???

Por otro lado presumo que puede pasar lo mismo con el foxypreview o quiza haya alguna manera especial de llamarlo para que no deje valores en memoria, agradezco su atencion y apoyo.

luisandrey

unread,
Aug 24, 2019, 4:14:17 PM8/24/19
to Comunidad de Visual Foxpro en Español
Amigos...

estoy usando este código que me lo compartió Abel RD(sysgen) para generar archivos pdf con foxypreviewer y les cuento que voy por arriba de los 350 documentos y les tengo estos registros.

Lparameters dFecha,cNombre,cReporte,gVerdir,cCondicion,cTipoinfo

cCondicion = Iif(Empty(cCondicion),[],[FOR ]+cCondicion)
cTipoinfo  = Iif(Empty(cTipoinfo),[Report],cTipoinfo)
SET STEP ON 
! Verificar existencia de directorio PDFs; sino crearlo.
cRutaSch = Addbs(Fullpath(""))+[PDFs]
If !Directory(cRutaSch)
Md (cRutaSch)
Inkey(1,[h])
leerRegw([RutaPdfs],cRutaSch,[DestinoDirs])
Endif

! Agregar Ruta, Fecha y Nombre: xEj.: C:\SiGeFe\PDFs\20181208 FC_B0015-00000002 JULIO CESAR.
dFecha       = Iif(Empty(dFecha),Date(),dFecha)
cRutapdfs    = "Z:\Apps\hasistema\PDFs"
*cArchivoPDF  = cRutapdfs+Dtos(dFecha)+[ ]+cNombre
cArchivoPDF  = cRutapdfs+[FacNro. ]+cNombre

*Do "FoxyPreviewer.App"
Do z:\apps\hasistema\FoxyPreviewer.App
_Screen.oFoxyPreviewer.lRepeatInPage = .T.
**Report Form (cReporte) To File (cArchivoPDF) Object Type 10 &cCondicion

lctexto=Num2Let(round( tabla_informes.valor_a + tabla_informes.iva ,0))
report Form (cReporte) To File (cArchivoPDF) Object Type 10 &cCondicion

Do FoxyPreviewer.App With "Release"

el sistema va tal cual empezó, no ha perdido rendimiento y tomé este registro al inicio y cuando superaba los 200 documentos.

les adjunto registro de memoria y procesos



El lunes, 19 de agosto de 2019, 12:34:47 (UTC-5), Comprobante Electronico escribió:
mas_de_200 pdfs.png
inicio.png
mas_de_200 pdfs.png

Comprobante Electronico

unread,
Aug 27, 2019, 3:35:04 PM8/27/19
to Comunidad de Visual Foxpro en Español
SOLUCIONADO:
----------------------

Después de tantas revisiones y análisis, pude determinar el porque  y darle una solución.

El detalle estaba en que el reporte tenia una imagen que pesaba 150 Kb, quite la imagen y el crecimiento de la memoria asignada es casi imperceptible.

Con ello pude comprobar que al generar el PDF mediante FoxPreviewer , se carga en algún lugar variables en memoria que no llega a liberar, pero al tener un reporte "mas pesado" el impacto era altísimo y en el transcurso de la generación de 3 mil comprobantes ya se había asignado mucha memoria y colapsaba con el mensaje Falta de memoria.

Ahora todo transcurre con normalidad, pero aun quisiera saber donde es que almacena o que variables se cargan y no se liberan, Uds. podrian replicar el caso añadiendo una imagen de un peso alto y podran ver como la memoria asignada es incremental.

Saludos.

El lunes, 19 de agosto de 2019, 12:34:47 (UTC-5), Comprobante Electronico escribió:

ZeRoberto

unread,
Aug 27, 2019, 3:39:17 PM8/27/19
to publice...@googlegroups.com
Seria bueno que le escribas a César Chalom creador del foxypreviewer en su página web debe estar su correo. 

Saludos 

ze 



--
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/4f8771ae-d241-4367-88ad-c35a1332e8f1%40googlegroups.com.

HernanCano

unread,
Aug 27, 2019, 4:04:11 PM8/27/19
to Comunidad de Visual Foxpro en Español
Sí, ZeRoberto. El dice que nos vé por aquí.

Recordemos que el manejo de imágenes tiene sus bemoles (al menos en VFP).

Voy a buscar la información que recuerdo y se las comparto.
Sólo que no es específico de FoxyPreviewer......


HernanCano

unread,
Aug 27, 2019, 4:57:36 PM8/27/19
to Comunidad de Visual Foxpro en Español
Amigo:
Aquí te muestro lo que hay sobre el tema.





De hecho he reeditado el ejemplo pmostrado en el primer artículo, pues lo que se ve en el original no me es lo suficientemente caro con respecto a lo que pretende decir.

<< Ejemplo2.prg >>

Jorge Galván Pérez

unread,
Aug 28, 2019, 8:51:03 AM8/28/19
to Comunidad de Visual Foxpro en Español
Por casualidad esa imagen es de tipo PNG??????



Comprobante Electronico

unread,
Aug 28, 2019, 6:56:44 PM8/28/19
to Comunidad de Visual Foxpro en Español
No, es un jpg, pero da lo mismo, el inconveniente es con el tamaño del archivo.

WGWH

unread,
Aug 29, 2019, 1:28:43 AM8/29/19
to Comunidad de Visual Foxpro en Español
Hola  Comprobante E. , hago uso del FoxPreviewer para generar PDF y también incluyo una imagen PNG  y no he tenido mayor problemas para generarlos.

Los archivos PDF una vez creados los envió por correo electrónicos por oficinas... "se van creando por oficinas", el código de generación y envío esta dentro de un bucle.... crea y libera cada generación dentro del mismo bucle (por oficina) nunca un solo PDF que contiene el total de oficinas con el total de registros.

El código que utilizas libera memoria después de generar el total de PDF y quizá requiere que liberes memoria antes de ese  total.

Por tanto has pruebas de generación de archivos de 100 pag.  en 100 o 300 en 300 o si no es posible de 1 en 1, pero libera memoria inmediatamente después de generar tus PDF, si después requieres unirlos hay otros mecanismos también pero averigua primero si es este tu caso.

SCAN ....
    al entrar al bucle -->loReport = CREATEOBJECT("PreviewHelper")
.
.
    .RunReport()
..
.
     al salir del buble -->loReport = .NULL.
ENDSCAN

Espero te sirva, porque fox no libera memoria solo en casos cuando usas automatización con OCX u  DLL (Word,Excel,Etc) que pueden colgarse en su propio hilo, en cualquier otro caso FOX es seguro que si hace la liberación de memoria que está en dominio de su hilo.

Saludos,

Walter W.

HernanCano

unread,
Aug 29, 2019, 1:40:03 PM8/29/19
to Comunidad de Visual Foxpro en Español
Walter:
Recuerda que FoxyPreviewer ya no se usa así.

WGWH

unread,
Aug 31, 2019, 1:51:39 PM8/31/19
to Comunidad de Visual Foxpro en Español
Correcto Hernan, sin embargo así dejé esa rutina y continúa trabajando no sé si César dejó la característica por compatibilidad descendente.

Saludos,

Walter W.

HernanCano

unread,
Aug 31, 2019, 4:04:52 PM8/31/19
to Comunidad de Visual Foxpro en Español

Así es, pero si se te presenta algún nconveniente, se te solicita que cambies al método standard.

Ignacio Debole

unread,
Jan 19, 2022, 12:37:18 AM1/19/22
to Comunidad de Visual Foxpro en Español
Hola!!
      tengo el mismo problema de saturación de memoria ram con el foxypreview. Tengo que imprimir 8000 pdfs y se me trunca en el 1500 aprox. porque se queda sin memoria.
      usé la forma simplificada:
"
        DO LOCFILE("foxypreviewer.App")
        *aquí antes abrir tablas sino están en el entorno de datos del informe
        REPORT FORM "&nombre_reporte"  ;&&el reporte
        OBJECT TYPE 10 ; &&' OBJTYPE 10 = PDF , 11 = PDF AS IMAGE , 12 = RTF , 13 = XLS , 14 = HTML
        TO FILE "&ruta_del_pdf" &&archivo pdf a crear
        DO FOXYPREVIEWER.APP WITH "Release"
"
    y la forma completa:
"
          SET PROCEDURE TO LOCFILE("FoxyPreviewer.App") ADDITIVE
          PUBLIC LOREPORT AS "PreviewHelper" OF "FoxyPreviewer.App" && PONGO PUBLIC A PROPÓSITO
          LOREPORT = CREATEOBJECT("PreviewHelper")
          WITH LOREPORT AS REPORTHELPER
                    .ADDREPORT(nombre_reporte, "NODIALOG")
                    .CDESTFILE = ruta_del_pdf
                    IF LEN(ALLTRIM(.CDESTFILE))>0
                           .RUNREPORT()
                    ENDIF
                   .Clearcache
           ENDWITH
           LOREPORT.REPORtreleased()
           LOREPORT = NULL
           RELEASE LOREPORT
"
     Y en ambos casos la memoria ram que usa el ejecutable empieza a trepar y trepar y alcanza los casi 2gb de ram y el programa colapsa.
     He probado con "        CLEAR RESOURCES SYS(5)+SYS(2003)+"\imagenes\gráfico1.jpg"" que el report usa esa imagen y pasa igual.
     Qué puedo hacer?
     Busqué usar "pdf3.prg" pero me dice que no puede encontrar DLL pero no sé de qué dll habla, la libharu está puesta en la misma carpeta y no funciona.
     ¿A alguien se le ocurre alguna otra solución para poder generar 8000 recibos sin que colapse la memoria ram?.
     Hace unos años usaba el "print2pdf" pero para hacer uno x uno era muy lento, pero no tenía problemas de memoria.
     Gracias

Edwin Duran

unread,
Jan 19, 2022, 6:49:46 AM1/19/22
to Comunidad de Visual Foxpro en Español
Buen día Prueba esto
***********************************************
* Function....:  ReduceMemory()
* Author......:  Bernard Bout
* Date........:  05/12/2007 3:03:15 PM
* Returns.....:
* Parameters..:
* Notes.......:  reduces memory usage for vfp
***********************************************
Function ReduceMemory()
        Declare Integer SetProcessWorkingSetSize ;
                IN kernel32 As SetProcessWorkingSetSize ;

                INTEGER hProcess , ;
                INTEGER dwMinimumWorkingSetSize , ;
                INTEGER dwMaximumWorkingSetSize
        Declare Integer GetCurrentProcess ;
                IN kernel32 As GetCurrentProcess

        nProc = GetCurrentProcess()
        bb = SetProcessWorkingSetSize(nProc,-1,-1)
Endfunc
*********************************************** 

Jose Antonio Blasco

unread,
Jan 19, 2022, 7:32:19 AM1/19/22
to Comunidad de Visual Foxpro en Español
Yo también he tenido ese problema, y con el "ReduceMemory" no se solucionó.
Después de muchas pruebas, determiné que era Foxypreviewer que deja algún rastro de memoria, que se va acumulando hasta bloquear el proceso.
He tenido que solucionarlo de esta manera:
- He creado un método que "carga" foxypreviewer
- Otro que lo "descarga" con el RELEASE y Set REPORTBEHAVIOR 80
- Por último otro que primero llama al de "descarga" y luego al de "carga", y es éste al que llamo tras cada "report form", que también tengo en un método  en mi archivo de procedimientos.
Creí que se tomaría mucho retardo, pero no.  No se aprecia.

Espero que os sirva la idea.
Un saludo.

Jose A. Blasco
Zaragoza - España
Visual FoxPro 9 SP2



--
Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.

Esteban Herrero

unread,
Jan 19, 2022, 8:07:36 AM1/19/22
to publice...@googlegroups.com

Hola....

Yo utilizo Print2Pdf + Ghostscript DLLs en convinación con la impresora virtual CutePdf y realizo impresiones de pdf de 3400 comprobantes sin interrupciones...

Una vez leí un posteo de Victor Espina y de ahí lo probe y la uso en todos mis programas.

https://groups.google.com/g/publicesvfoxpro/c/U7jauTkAPec/m/ll2VrqrJBAAJ

Saludos

Esteban

--
Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.

Ignacio Debole

unread,
Jan 19, 2022, 8:47:12 AM1/19/22
to Comunidad de Visual Foxpro en Español
primero gracias a todos por sus respuestas, veo que no soy el unico.
El Print2pdf lo usaba con GhostScript pero era un ejecutable el "gswin32.exe" que había que enviarle el report como archivo ".ps" (post script).
En definitiva como pasaba por varios procesos tardaba mucho en procesar todo.
Intentaré con PDF3() con la ultima librería que encontré de "libhpdf.dll" y pronto les contaré cómo me fué.
Y si no hay buenos resultados, sigo con la de Victor Espina que parece prometedora.
Muchas gracias!

HernanCano

unread,
Jan 19, 2022, 6:06:43 PM1/19/22
to Comunidad de Visual Foxpro en Español
Estoy de acuerdo contigo, Jose.

Si a los colegas todavía les parece lento, entonces pueden imprimir por lotes: cada cien, cada doscientos, cada quinientos, cada mil,...., según descuban la mejor proporción: la menor lentitud y mejor rapidez.

Reply all
Reply to author
Forward
0 new messages