PDA

Ver la Versión Completa : Impresion a PDF


juanelo
10-01-2011, 20:42:48
Un saludo,
Ando en busca de un componente para poder exportar o "imprimir" directamente un reporte hecho con QReport a PDF.
Ya se que una opcion es instalar una impresora PDF y mandar la impresion a esta, pero no es viable para mi en la solucion que propongo porque necesito que se grabe o se exporte el reporte en un directorio especifico para luego "atacharlo" en un mensaje de correo electronico.
Desde ya les mando las gracias y espero me puedan ayudar.

Casimiro Notevi
10-01-2011, 21:06:10
Lo que quieres hacer... puedes hacerlo con la impresora virtual, por ejemplo: pdfcreator.

juanelo
10-01-2011, 21:08:02
Lo que quieres hacer... puedes hacerlo con la impresora virtual, por ejemplo: pdfcreator.
No Casimiro, precisamente no es viable para mi el usar una impresora PDF porque necesito que se grabe en un directorio especifico y luego enviarlo por correo.

Casimiro Notevi
10-01-2011, 21:09:55
Sí, puedes hacerlo así.

Casimiro Notevi
10-01-2011, 21:22:35
Mediante comandos de consola con parámetros puedes guardarlo donde quieras para luego enviarlo.
Tiene muchos parámetros útiles, ya se ha hablado antes del tema, a ver si lo encuentro.

Casimiro Notevi
10-01-2011, 21:25:04
Aquí está (http://www.clubdelphi.com/foros/showthread.php?t=69790&highlight=pdfcreator+comandos), espero que te sirva.

juanelo
11-01-2011, 00:59:21
Mediante comandos de consola con parámetros puedes guardarlo donde quieras para luego enviarlo.
Tiene muchos parámetros útiles, ya se ha hablado antes del tema, a ver si lo encuentro.
Casimiro, muchas gracias por tus respuestas, pero creo que no me has entendido.
Lo que necesito es que mi aplicacion genere el PDF (desde una impresion con QReport) pero que yo pueda indicarle donde grabar este PDF sin enviar el dialgo de guardar del PDFCreator para luego enviar dicho arcchivo por correo electronico.
He manejado el PDFCreator y la informacion que mandas acerca de la linea de comandos es suponiendo que ya tienes el archivo fuente para enviarle a PDFCreator (ya sea en .DOC, en .PS, etc.
Tambien se que tiene opciones de autoguardado, pero esto afecta a cualquier impresion que se haga con la impresora PDF y no solo las que mande mi aplicacion.
Espero haberme explicado un poco mejor.
Gracias.

adebonis
11-01-2011, 01:08:26
QReport 4.07 permite crear PDF's.

muestra del código:

if SaveDialog.Execute then begin
Cur := Screen.Cursor;
Screen.Cursor := crHourGlass;
FName := ChangeFileExt(SaveDialog.FileName,'');
// Según el tipo de archivo del SaveDialog (1=txt, 2=doc, 3=xls, 4=pdf, 5=html
case SaveDialog.FilterIndex of
1: QrPrinter.ExportToFilter(TQRPDFDocumentFilter.Create(FName+'.pdf'));
2: QrPrinter.ExportToFilter(TQRRTFExportFilter.Create(FName+'.rtf'));
3: QrPrinter.ExportToFilter(TQRXLSFilter.Create(FName+'.xls'));
4: QrPrinter.ExportToFilter(TQRGHTMLDocumentFilter.Create(FName+'.html'));
5: QrPrinter.ExportToFilter(TQRAsciiExportFilter.Create(FName+'.txt'));
end;
Screen.Cursor := Cur;
end;


Espero que sirva.

Adolfo Bonis
Barcelona

juanelo
11-01-2011, 01:11:51
Gracias por tu respuesta adebonis (http://www.clubdelphi.com/foros/member.php?u=365), pero el filtro para exportar a PDF funciona bastante mal cuando incluyes "shapes" en tu reporte, por eso la busqueda un buen componente o bien de una solucion eficiente.
Saludos.

Casimiro Notevi
11-01-2011, 01:21:03
Creo que no me has entendido tú, amigo :), con tu qreport o con lo que quieras, creas un informe y lo imprimes, en este caso lo imprimes a través de pdfcreator (el usuario no tiene por qué ver nada), y lo "imprimes" en un fichero pdf, que luego envias, es totalmente "transparente" para el usuario.
Supongo que existirán componentes específicos para qreport que sirva para generarlo directamente, pero lo que te comento es una alternativa muy válida.

juanelo
11-01-2011, 01:26:26
Creo que no me has entendido tú, amigo :), con tu qreport o con lo que quieras, creas un informe y lo imprimes, en este caso lo imprimes a través de pdfcreator (el usuario no tiene por qué ver nada), y lo "imprimes" en un fichero pdf, que luego envias, es totalmente "transparente" para el usuario.
Supongo que existirán componentes específicos para qreport que sirva para generarlo directamente, pero lo que te comento es una alternativa muy válida.
Si la verdad es que creo tienes razon, no he entendido tu solucion.
Te cuento, la unica manera de poder imprimir de forma "transparente" para el usuario con el PDFCreator es mediante la opcion de "autosave", no veo como hacerle con la linea de comandos. Si no es mucho abusar de tu confianza podrias indicarme como hacerle mediante la comand line porque al menos de la ayuda que trae esta herramienta lo que entiendo es que hay que tener el archivo fuente para enviarselo al PDFCreator y que este haga su trabajo de convertirlo en PDF.
Gracias.

Casimiro Notevi
11-01-2011, 02:14:36
Sí, bueno, se supone que el proceso para lo que quieres hacer es:

Imprimes a la "impresora" pdfcreator, esto te crea un pdf
Desde tu programa envias ese pdf como adjunto en un emailAunque si quieres usar componentes para quickreport, he visto que en torry (http://www.torry.net/pages.php?s=86) tienen algunos que pueden servirte, échales un vistazo.

juanelo
11-01-2011, 16:50:11
Sí, bueno, se supone que el proceso para lo que quieres hacer es:
Imprimes a la "impresora" pdfcreator, esto te crea un pdf
Desde tu programa envias ese pdf como adjunto en un emailAunque si quieres usar componentes para quickreport, he visto que en torry (http://www.torry.net/pages.php?s=86) tienen algunos que pueden servirte, échales un vistazo.
¿Debo entender entonces que no hay manera de hacerlo mediante la linea de comandos, sin antes tener el archivo fuente?.
Gracias.

roman
11-01-2011, 18:12:12
Quizá me equivoque, pues para empezar, nunca he usado el PDFCreator.

A mi me parece que lo que pregunta Juanelo es excatamente lo mismo que preguntaba Neftalí en el otro hilo y Neftalí parece haberse dado por satisfecho, de manera que habría que preguntarle a él qué fue lo que hizo.

Lo curioso es que, leyendo la información proporcionada, a mi me parece que lo de la línea de comandos no resuelve ni lo de Juanelo ni lo de Neftalí.

Sin embargo, parece que el PDFCreator puede manejar mútiples impresoras virtuales y cada una puede asociarse a un profile determinado. Quizá se pueda entonces, usa un profile con la opción autosave y mandar la impresión a la impresora virtual correspondiente al profile.

// Saludos

Casimiro Notevi
11-01-2011, 18:24:31
Creo que entonces no he entendido exactamente. Si envías cualquier informe a la "impresora" pdfcreator te lo guarda en un fichero con formato pdf. Ese fichero luego lo envías por email.
Quizás el único detalle es que no muestre en pantalla la ventana del programa, pero eso creo que es configurable.
Incluso el propio pdfcreator tiene un botón "email" junto al botón "guardar".

Casimiro Notevi
11-01-2011, 18:30:07
Con pdfcreator.exe /showonlyoptions se abre una ventana de configuración de muchos de los parámetros, ahí puedes configurar para que se autoguarde, el directorio donde lo quieres, etc.

Neftali [Germán.Estévez]
12-01-2011, 14:05:21
Échale un vistazo a estas opciones (http://clubdelphi.com/foros/showpost.php?p=375975&postcount=14).

Neftali [Germán.Estévez]
12-01-2011, 14:35:33
He vuelto a hacer la prueba para recordar y funciona perfectamente. La unica cosa que debes hacer es guardar un perfil con las opciones que deseas y luego utilizando la línea de comandos enviar la impresión utlizando ese perfil.


PDFCreator.exe /NOSTART /PF"r:\Readme.txt" /OptionsFile"r:\Neftali.ini"


En mi caso con esta línea genero un PDF a partir del fichero README.TXT con las opciones definidas en Neftali.ini

En el fichero de opciones puedes definir todo lo que necesites, desde el nombre del fichero de salida (fijo o utilizando variables), hasta si lo quieres enviar por mail (tipo de envío), marcas de agua, propiedades del documento, características del guardado, acciones a realizar antes y después de generar el fichero (por ejemplo ejecutar cualquier otro programa con parámetros), configuración de la impresión, Tipografías,...

Lo bueno, es que puedes tener varios ficheros de configuración y dependiendo de las necesidades utilizar el que quieras.

roman
12-01-2011, 15:40:41
Oye Neftalí, pero, o no estoy entendiendo, o esto que pones no es lo que preguntabas en el otro hilo, específicamente aquí (http://www.clubdelphi.com/foros/showpost.php?p=375973&postcount=13).

Lo que aqui pones, es cómo generar un pdf a partir de un archivo ya existente, mientras que en el otro hilo querias:

Apretar un botón <Generar PDF> que lanzara la impresión pdf y que se obviara la ventana que pregunta dónde colocar el archivo.

En todo caso, creo que Juanelo lo que desea es lo primero, pues él genera un reporte con QR que, al menos con la versión gratuita sólo puede mandar el reporte a la impresora más no guardarlo en nigún archivo.

// Saludos

Neftali [Germán.Estévez]
12-01-2011, 17:14:45
Oye Neftalí, pero, o no estoy entendiendo, o esto que pones no es lo que preguntabas en el otro hilo, específicamente aquí (http://www.clubdelphi.com/foros/showpost.php?p=375973&postcount=13).

Lo que aqui pones, es cómo generar un pdf a partir de un archivo ya existente, mientras que en el otro hilo querias:

Apretar un botón <Generar PDF> que lanzara la impresión pdf y que se obviara la ventana que pregunta dónde colocar el archivo.


Perdón, es que en mi caso lo he utilizado de las 2 maneras y tal y como coloqué el mensaje sólo parece que se utilice o que quede claro cuando lo haces desde fichero.

Para el caso en que se utiliza como impresora desde un programa, basta con configurar de la misma manera el Perfil que la impresora llama "PREDETERMINADO"; Por defecto el prefil PREDETERMINADO tiene la opción de "Preguntar por el nombre"; Si en ese "Perfil predeterminado" se le asigna, por ejemplo, que el nombre de salida es R:\OUT.PDF, cada impresión que se envíe se generará en este fichero sin intervención. Luego desde el programa Delphi se puede "tratar" como sea necesario (copiar, mover, renombrar, Abrir,...).

No se si ahora ha quedado más claro... :o

roman
12-01-2011, 19:21:51
No se si ahora ha quedado más claro... :o

Me parece que sí. Aunque, supongo, sería mejor crear un perfil ad hoc para la aplicación en cuestión y así no afectar la conversión-impresión predeterminada.

// Saludos

Neftali [Germán.Estévez]
13-01-2011, 11:04:28
Aunque, supongo, sería mejor crear un perfil ad hoc para la aplicación en cuestión y así no afectar la conversión-impresión predeterminada.

Correcto, pero lo que ya no se es cómo enviarías la impresión modificando el perfil PREDETERMINADO. Cuando Desde Delphi haces, por decir algo, un:


RichEdit.Print;


No tienes opción de cambiar el perfil. Si cuando trabajas en el otro modo (enviar un fichero ya existente en disco) porque lo haces utilizando línea de comandos.

En este caso una opción sencilla es tener 2 instancias del programa, 2 impresoras. Y utilizar una para generar PDF's; Por ejemplo que siempre se generan en R:\out.pdf.

juanelo
18-01-2011, 00:26:55
Agradezco a todos los que amablemente respondieron este hilo, al final les digo que termine usando los filtros de QReport, claro, limitando al formato o diseño del mismo, es decir, no se es permitido usar "shapes" rectangulares, lo cual dicho sea de paso solo representa mas trabajo de construccion del reporte.
No es lo mejor, pero debido al tiempo y el coste del proyecto creo fue la mejor solucion, aunque sigo en busca de un buen componente para hacer la exportacion. El cual si encuentro tengan por seguro que uds seran los segundos en saberlo.
Muchas gracias de nuevo.
Juanelo.

nnebli
07-10-2014, 22:19:13
Buenas noches.

Estoy buscando información de como guardar un archivo PDF sin que me pregunte el nombre del archivo, de tal forma que yo se lo pase y lo guarde directamente, o que se cree el PDF con un nombre por defecto y yo lo cambie después.

Actualmente hago lo siguiente:

1) Creo directamente en el Cavas lo que quiero tener en PDF

2) Lo envío en la impresora en PDF que previamente he seleccionado entre las que tengo instaladas

3) Cuando lo va a imprimir en PDF me pide el nombre del archivo y al dar el nombre del archivo y hacer click en guardar ya tengo el documento PDF.


Lo que quiero es que el paso 3) se lo salte porque yo le pase el nombre del archivo o que lo guarde con un nombre por defecto y luego yo lo cambie. Prefiero la primera opción, pero la segunda también me valdría.

Creo que lo que comenta Neftalí es una de las dos opciones que has indicado, pero en mi caso sería imprimiendo el Cavas en PDF.

Me puede alguien decir como obtener el archivo en PDF imprimiendo directamente sobre el Canvas sin que me pida el nombre del archivo.

Disculpad si me repito en lo que habéis explicado, pero no 'controlo' mucho este tema.

Gracias anticipadas a quien me pueda ayudar.

Saludos.

Neftali [Germán.Estévez]
08-10-2014, 10:16:45
En mi caso, tal y como he dicho aquí (http://www.clubdelphi.com/foros/showpost.php?p=387298&postcount=18) lo he realizado utilizando un perfil personalizado. En ese caso especificas las opciones y no te pide el nombre del archivo.

nnebli
08-10-2014, 22:52:57
Buenas noches.

Según comentas, conviertes un fichero de tipo txt a PDF y con la configuración que indicas no hace falta darle el nombre del fichero. En mi caso creo no es lo mismo, yo voy escribiendo en el cavas y una vez que he terminado, al cerrar el documento con 'EndDoc' te pide el nombre del archivo (saliendo por defecto el que lleva como título el documento que se está imprimiendo) y al darle a guardar, se guarda, y ya está creado el documento pdf. Como es natural, tenemos que haber seleccionado previamente que la impresora es la que indica PDF.

Lo que no entiendo de lo que comentas, es como crear lo del perfil personalizado, no se si eso es para PdfCreator o si sirve para cualquier conversor de PDF. En mi caso me pone que se trata de Adobe Acrobat.

Te agradecería tus comentarios.


A continuación pongo un pequeño ejemplo de lo que hago:


Procedure EjemploParaImprimirEnElCanvas;
Begin

// trabaja con la Impresora
With Printer Do
Begin

Title := 'Titulo del documento';

BeginDoc;

// trabaja con el Canvas ( la superficie donde se va imprimiendo ) de la Impresora
With Canvas Do
Begin

// fija el tipo de letra elegido
Font.Name := 'Courier New'; // TipoDeLetraElegido;

// fija las unidades de trabajo a milímetros
SetMapMode(Printer.Handle,MM_LOMETRIC);

// imprimimos en el Canvas el texto indicado
TextOut(45,-70,'ESTO ES UNA PRUEBA');

End;
// fin de: trabaja con el Canvas ( la superficie donde se va imprimiendo ) de la Impresora

// termina el documento
EndDoc

End;
// fin de: trabaja con la Impresora

End;

newtron
09-10-2014, 09:25:01
guiente:

1) Creo directamente en el Cavas lo que quiero tener en PDF

2) Lo envío en la impresora en PDF que previamente he seleccionado entre las que tengo instaladas

3) Cuando lo va a imprimir en PDF me pide el nombre del archivo y al dar el nombre del archivo y hacer click en guardar ya tengo el documento PDF.



y digo yo.... ya que usas el canvas para generar el impreso ¿por qué no utilizas algún componente pdf y generas directamente el pdf sin tener que usar una impresora virtual?.

Saludos

Neftali [Germán.Estévez]
09-10-2014, 10:06:55
La idea de las impresoras virtuales (entre ellas PDFCreator, que es de la que hablábamos), es que sirven para cuialquier cosa que imprimas y de cualquier forma. Da igual que imprimas desde word, desde un generador de reports, o desde canvas directamente. Cuando envía a la impresora PDF, habituamente te sale un cuadro de dialogo para seleccionar algunas opciones; Entre ellas una de la más importante es el nombre de fichero.

Lo que comento de crear un perfil, es que utilizando un fichero de configuración (fichero de perfil) puedes hacer que este cuadro de diálogo no aparezca, de forma que desde el programa sólo tienes que seleccionar la impresora "PDF" y enviar la impresión. Si lo configuras en el perfil se generará el PDF de forma automática sin intervención del usuario.

newtron
09-10-2014, 10:36:45
La idea de las impresoras virtuales (entre ellas PDFCreator, que es de la que hablábamos), es que sirven para cuialquier cosa que imprimas y de cualquier forma. Da igual que imprimas desde word, desde un generador de reports, o desde canvas directamente. Cuando envía a la impresora PDF, habituamente te sale un cuadro de dialogo para seleccionar algunas opciones; Entre ellas una de la más importante es el nombre de fichero.

Lo que comento de crear un perfil, es que utilizando un fichero de configuración (fichero de perfil) puedes hacer que este cuadro de diálogo no aparezca, de forma que desde el programa sólo tienes que seleccionar la impresora "PDF" y enviar la impresión. Si lo configuras en el perfil se generará el PDF de forma automática sin intervención del usuario.

Si todo eso lo entiendo, lo que yo digo es que si imprime en el canvas, con un cambio fácil puede imprimir en el canvas de un componente pdf y se ahorra el instalar impresoras pdfs que es lo que yo hago.

Neftali [Germán.Estévez]
09-10-2014, 11:15:48
...lo que yo digo es que si imprime en el canvas, con un cambio fácil puede imprimir en el canvas de un componente pdf y se ahorra el instalar impresoras pdfs que es lo que yo hago.

Totalmente de acuerdo.
Mi comentario iba en referencia a esto que ha comentado él.


...yo voy escribiendo en el cavas y una vez que he terminado, al cerrar el documento con 'EndDoc' te pide el nombre del archivo (saliendo por defecto el que lleva como título el documento que se está imprimiendo) y al darle a guardar, se guarda, y ya está creado el documento pdf. Como es natural, tenemos que haber seleccionado previamente que la impresora es la que indica PDF.

nnebli
09-10-2014, 17:28:45
Newtron comentó:
------------------
y digo yo.... ya que usas el canvas para generar el impreso ¿por qué no utilizas algún componente pdf y generas directamente el pdf sin tener que usar una impresora virtual?.

Saludos

fin comentario de: Newtron
--------------------------


Buenas tardes.

Gracias Newtron por unirte a los comentarios que siempre son de agradecer.

El problema de cambiar lo que hay hecho actualmente, es que el desarrollo ya está hecho y en su día, cuando me propuse que en lugar de salir la información en papel saliese a un archivo tipo PDF, lo desarrollé como lo tengo actualmente. Cambiarlo, aunque pueda parecer sencillo, creo que a primera vista es muy complicado para mí, por dos cosas: La principal que no tengo tiempo ni de rascarme y la segunda es que tendría que volver a realizar algo que posiblemente con algún fichero de configuración inicial o algo parecido, como dice Neftalí, se podría solucionar.

El programa donde está este módulo de impresión, llevo desarrollándolo posiblemente más de 25 años (no se si te sonará el Amstrad de 64 K que tenía una disquetera junto al teclado a la derecha de éste, con ese comenzó el programa y desde entonces se ha ido mejorando y poniendo cosas nuevas. En un determinado momento lo migré de Pascal a Delphi 3.0 y luego a Delphi 7). La unidad que se encarga de imprimir los distintos documentos según un formato concreto que se tienen que imprimir, ocupa más de 32.000 líneas, sólo esta unidad, porque después hay unidades para otras muchas cosas.

Sin ánímo de enrollarme más, , estoy comentando esto para hacer ver lo complicado que me resultaría cambiar todo el tema de la impresión

Lo que estoy buscando es algo sencillo, archivo de configuraicón o algo parecido que permita crear el PDF cogiendo el nombre del archivo que yo le paso por código, amoldándome a lo que ya hay hecho.

Lo que comentas Newtron de no tener que utilizar el cavas parece muy interesante, pero me imagino que tendría que resapar toda esa cantidad de líneas que tengo de código e ir cambiando lo que corresponda. Si es eso así, aunque la idea parece muy buena, en este momento no dispongo del tiempo que se necesitaría para hacer esto.

Hay alguien que se le ocurra algo sencillo que funcione con la forma de trabajar que comenté anteriormente y que me pueda ayudar.

Gracias anticipadas.

newtron
09-10-2014, 18:40:47
A ver....

O yo no me entero o tú no entiendes lo que te digo. Intentaré explicarme con un ejemplo. Esto que te pongo a continuación es usando un componente que se llama RolePDF y que se maneja exactamente igual que el objeto printer con lo que todo, o casi todo, tu código te serviría, solo que tendrías que iniciar el canvas con este componente.


procedure TForm1.Button1Click(Sender: TObject);
var
PDF: TrolePDF;
begin
PDF:=TrolePDF.Create(nil);
PDF.BeginDoc ;
PDF.FileName := 'PRUEBA.PDF';
PDF.AutoLaunch := True;
PDF.BeginDoc ;

SetBKMode(PDF.Canvas.Handle, TRANSPARENT);
PDF.Canvas.Brush.Color := 16777215;
PDF.Canvas.Brush.Style := bsSolid;
PDF.Canvas.Pen.Style := psSolid;
PDF.Canvas.Pen.Width := 1;
PDF.Canvas.Pen.Color := 0;

PDF.Canvas.FillRect(Rect(144,114,211,179));
PDF.Canvas.Rectangle(144,114,211,179);

PDF.Canvas.Brush.Color := 9868950;
PDF.Canvas.FillRect(Rect(227,114,294,179));
PDF.Canvas.Rectangle(227,114,294,179);

PDF.Canvas.Brush.Color := 16777215;
PDF.Canvas.FillRect(Rect(310,114,377,179));
PDF.Canvas.Rectangle(310,114,377,179);

PDF.EndDoc ;
PDF.Free;

end;


Este ejemplo lo que hace es crear tres cuadros rellenos y ejecutar el visor de pdf para abrirlo de forma automática.

No sé si esto resuelve tu duda.
Saludos

nnebli
09-10-2014, 22:24:54
Gracias Newton por tu respuesta.

El problema, como ya comenté antes, es que mis conocimientos son mucho más reducidos que los vuestros, y entonces hay cosas que comentáis que no sé por donde cogerlas.

Con el ejemplo que has puesto ha quedado todo más claro.

Si además dices que posiblemente no haya que cambiar casi código, mejor todavía.

Intentaré probarlo lo antes posible y si veo que vale la pena, haré los cambios necesarios para trabajar como indicas tú a la hora de crear los PDF.

Gracias y un saludo.