PDA

Ver la Versión Completa : problemas de conversión a PDF con ReportBuilder y TExtraDevices


agustibaldo
03-07-2007, 15:12:05
Hola gente de Club Delphi, les escribo nuevamente para solicitar su ayuda con un problema que me surgio al intentar convertir un reporte generado en Report Builder a PDF con el componente TExtraDevices en Delphi6. Concretamente utilizo una función incorporada en el TExtraDevices ( ExportToMail() ) para convertir el reporte generado a PDF y a su vez enviarlo por Email a un destinatario predeterminado.

El problema es que el proceso es muy ("demasiado") pesado, consume el 100% de los recursos de la PC y, ademas, demora 6 minutos!!! en realizar la conversión más el tiempo que demora en enviar el archivo generado por correo electrónico.

Existe alguna posibilidad de corregír esta situación. Tal vez algún otro componente que trabaje con ReportBuilder y que cumpla con estas funciones.

Muchas Gracias por su tiempo y ayuda.
Saludos.

Casimiro Notevi
03-07-2007, 20:16:10
Yo los uso y no he tenido ese problema.
De todas formas, también puedes usar PDFCreator (http://pdfcreator.softonic.com/), que crea una impresora "virtual" a la que puedes enviar cualquier impresión y ésta es almacenada en un archivo pdf.
Además es software libre, con licencia gpl.

agustibaldo
04-07-2007, 19:39:50
Casimiro muchas gracias por tu respuesta. Pero te comento que dada las características del documento PDF que tengo que generar (un informe con imagenes y texto con formato), no encontre forma (o al menos no supe como) de generar ese PDF, sin setear la propiedad de "convertir a imagen" en True, en las ExtraDevices. Resumiendo esto, creo que el problema de lentitud en la conversión se debe a que tiene que transformar todo el reporte en una imagen debido al texto enriquecido. Opte por esto porque al probar generar el PDF sin convertir a imagen, el formato del mismo no salía como deseaba y ademas no me reproducía fielmente lo que presentaba previamente en el reporte. Para ser mas específico, los texto salían sin el formato que tenía el reporte, los gráficos cortados y fuera de lugar, etc...

Como te mencionaba en la primer consulta, necesito que la conversión a PDF y el envío del email se hagan en forma conjunta. O al menos en diferentes pasos pero en forma transparente para el usuario. Por ejemplo, generando un archivo PDF temporal que luego de enviarse por mail se elimine..

Existirá algun componente que trabaje con ReportBuilder (o sea que genera el PDF tomando como base el reporte generado y no un documento existente)? O tal vez una impresora virtual que imprima PDF y que pueda ser llamada por código para luego ejecutar el envío?

Nuevamente agradezco tu tiempo y esfuerzo en responder mi consulta.
Saludos.

Casimiro Notevi
04-07-2007, 19:46:30
Parece que no has entendido lo que he escrito, o no he sabido explicarme :rolleyes:

Puedes generar con reportbuilder un archivo pdf y lo envias por email o haces lo que quieras con él. Yo lo uso y sin problema alguno de lentitud, también con el textradevices.

Y puedes también, como te he comentado, usar una 'impresora virtual' con pdfcreator, que es libre, gratis y lo usas como una impresora cualquiera. El resultado queda almacenado en un archivo pdf y luego lo puedes enviar por email o hacer lo que quieras con él.

En ambos casos el resultado del pdf es excelente.

agustibaldo
04-07-2007, 20:16:43
Casimiro nuevamente gracias por tu respuesta. En realidad no entendía lo que habías querido decir:rolleyes: . Ademas desconocía la posibilidad de generar PDF directamente con ReportBuilder. Pensaba que para eso debía usar el componente TExtraDevices. Probaré de esta forma y te comento como fue...

Muchas Gracias.
Saludos.

Casimiro Notevi
04-07-2007, 20:37:33
Casimiro nuevamente gracias por tu respuesta. En realidad no entendía lo que habías querido decir:rolleyes: . Ademas desconocía la posibilidad de generar PDF directamente con ReportBuilder. Pensaba que para eso debía usar el componente TExtraDevices. Probaré de esta forma y te comento como fue...

Muchas Gracias.
Saludos.

je, je... definitivamente, no sé explicarme :o Sí que necesitas el TExtraDevices para generar pdf con reportbuilder. Al menos en la versión que tengo, bastante antigua.

agustibaldo
04-07-2007, 21:08:48
Jajajaja... :D había interpretado otra cosa... Yo estoy utilzando la versión 7.02 de ReportBuilder y creo que la versión 2.14 del ExtraDevices y no había podido generar PDF directamente desde ReportBuilder. Por eso utilizaba TExtraDevices.

De todas formas muchas gracias...
Saludos..

agustibaldo
05-07-2007, 14:56:54
Casimiro, por último me resta preguntarte como seteas las propiedades del TExtraOptions para generar un PDF correctamente (tal cual presenta el reporte) sin tener que convertir a una imagen...

Lo he intentado y la salida deja bastante que desear... En este momento las propiedades las seteo de la siguiente manera:

PDF
CompressImage : True
FastCompress : False
ItemsToExport -> todos en True...
Keywords: ' '
PixelFormat: pf24bit
PixelperInch: 96
RichTextAsImage : True (esta es la propiedad que seteo para que el reporte se imprima correctamente)
ScaleImages : True
Visible : True

De esta manera, y tal cual lo veníamos hablando, el archivo PDF se imprime correctamente pero demora 6 minutos!!! para un reporte de 15 páginas, consume el 100% de CPU, etc, etc, etc...

Nuevamente gracias...
Saludos...

Casimiro Notevi
05-07-2007, 15:22:08
Pues la verdad es que nunca jamás he tocado esos parámetros.

Lo único que hago es imprimir a: PDFfile y el nombre del fichero a imprimir, nada más.

A ver si te pongo un trocito de código, para que lo veas...

Casimiro Notevi
05-07-2007, 21:31:56
Bueno, aquí tienes un trozo de código que envía un informe a disco, en formato pdf y luego lo envía por email.

//
if bPreview then
ppInformes.DeviceType := 'Screen'
else
ppInformes.DeviceType := 'Printer';
//
if bEsEmail then
begin
ppInformes.ShowPrintDialog := bMostrarDlg;
ppInformes.PrinterSetup.Copies := 1;
ppInformes.AllowPrintToArchive := true;
ppInformes.DeviceType := 'PDFfile';
cDocumento := ExtractFilePath(ParamStr(0)) +'e-mails\';
if not DirectoryExists( cDocumento ) then
if not CreateDir( cDocumento ) then
LanzarExcepcion('Error al crear el directorio:'+cDocumento);
cDocumento := cDocumento + 'report2email' + FormatDateTime('yymmddhhnnss',now) + '.pdf';
ppInformes.TextFileName := cDocumento;
end;
//
ppInformes.Print; // Lo envia a impresora o fichero si es para email
//
if bEsEmail then
begin
if bPreview then
begin
cPrograma := funciones.BuscarEjecutableAsociado( cDocumento );
funciones.RunAndWaitShell( cPrograma, cDocumento, Sw_ShowNormal );
end;
EnviarEmail( iCodInforme, cDocumento, cDatosEmail, bMostrarDlgMail );
end;
//

agustibaldo
06-07-2007, 14:52:41
Casimiro, muchas gracias por el código que posteaste, te comento que probé una forma similar a la que presentas y tenía el mismo problema... De todas formas, y siguiendo una de tus sugerencias, probé el PDFCreator que genera una impresora virtual...

Entonces para resolver la necesidad de generar el PDF del reporte y adjuntarlo a un email (todo en forma transparente para el usuario) seteo en las propiedades del ReportBuilder, que la salida no sea por pantalla sino por impresora, y a su vez defino como impresora el PDFCreator. Ademas seteo algunas propiedades del PDFCreator de tal manera que me autoguarde el documento (para que no habra un cuadro de dialogo que solicita ubicación\nombre de archivo) en una ruta determinada... Así lo único que resta es adjuntarlo por email... E finito!! :D

Una vez mas agradezco tu ayuda.
Salutti!!