Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Impresion a PDF (https://www.clubdelphi.com/foros/showthread.php?t=71777)

juanelo 10-01-2011 20:42:48

Impresion a PDF
 
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 Noteví 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

Cita:

Empezado por Casimiro Notevi (Mensaje 387120)
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 Noteví 10-01-2011 21:09:55

Sí, puedes hacerlo así.

Casimiro Noteví 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 Noteví 10-01-2011 21:25:04

Aquí está, espero que te sirva.

juanelo 11-01-2011 00:59:21

Cita:

Empezado por Casimiro Notevi (Mensaje 387123)
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:
Código Delphi [-]
  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, 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 Noteví 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

Cita:

Empezado por Casimiro Notevi (Mensaje 387148)
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 Noteví 11-01-2011 02:14:36

Sí, bueno, se supone que el proceso para lo que quieres hacer es:
  1. Imprimes a la "impresora" pdfcreator, esto te crea un pdf
  2. Desde tu programa envias ese pdf como adjunto en un email
Aunque si quieres usar componentes para quickreport, he visto que en torry tienen algunos que pueden servirte, échales un vistazo.

juanelo 11-01-2011 16:50:11

Cita:

Empezado por Casimiro Notevi (Mensaje 387155)
Sí, bueno, se supone que el proceso para lo que quieres hacer es:
  1. Imprimes a la "impresora" pdfcreator, esto te crea un pdf
  2. Desde tu programa envias ese pdf como adjunto en un email
Aunque si quieres usar componentes para quickreport, he visto que en torry 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 Noteví 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 Noteví 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.

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.

Código:

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í.

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

Cita:

Empezado por roman (Mensaje 387303)
Oye Neftalí, pero, o no estoy entendiendo, o esto que pones no es lo que preguntabas en el otro hilo, específicamente aquí.

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

Cita:

Empezado por Neftali (Mensaje 387318)
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

Cita:

Empezado por roman (Mensaje 387341)
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:

Código Delphi [-]
   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

Obtener un archivo en PDF sin que nos pida el nombre del archivo
 
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í 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:

Código Delphi [-]
 
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

Cita:

Empezado por nnebli (Mensaje 482670)
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

Cita:

Empezado por Neftali (Mensaje 482796)
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

Cita:

Empezado por newtron (Mensaje 482797)
...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.


Cita:

Empezado por nnebli (Mensaje 482785)
...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.

Código Delphi [-]
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.


La franja horaria es GMT +2. Ahora son las 07:32:04.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi