Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Error al actualizar PDFcreator (https://www.clubdelphi.com/foros/showthread.php?t=90919)

tarco35 08-10-2016 22:01:28

Error al actualizar PDFcreator
 
Hola, hasta hace poco el codigo usado para generar un report (qreport) y generar con pdfcreator 1.7.3 el archivo correspondiente funcionaba correctamente, el código es de Roman (moderador):
Código Delphi [-]
 OldPrinterIndex := FormImprimePaciente.PrnPaciente.PrinterSettings.PrinterIndex;
  FormImprimePaciente.PrnPaciente.PrinterSettings.PrinterIndex := PrinterIndex;
  PdfCreator := CreateOLEOBject('PDFCreator.clsPDFCreator');
  try
    PdfCreator.cStart();
    PdfCreator.cOption('UseAutosave') := 1;
    PdfCreator.cOption('UseAutosaveDirectory') := 1;
    PdfCreator.cOption('AutosaveDirectory') := RutaGuardar;
    PdfCreator.cOption('AutosaveFilename') := NombreFichero; // la extensión es opcional
    PdfCreator.cOption('AutosaveFormat') := 0; // PDF format

    FormImprimePaciente.PrnPaciente.ReportTitle := 'BIA_Test: Datos Paciente';
    With FormImprimePaciente Do begin
      If FileExists(ModuloDatos.TablaCentroTrabajoNombreLogo.AsString) then
        QRLogo.Picture.LoadFromFile(ModuloDatos.TablaCentroTrabajoNombreLogo.AsString)
      Else QRLogo.Picture := nil;
      QRLogo.Stretch := ModuloDatos.TablaCentroTrabajoAjusteLogo.AsBoolean;
      QRLabel94.Caption := ModuloDatos.TablaCentroTrabajoNombre1.AsString;
      QRLabel24.Caption := ModuloDatos.TablaCentroTrabajoNombre2.AsString;
      QRLabel95.Caption := ModuloDatos.TablaCentroTrabajoLinea1.AsString;
      QRLabel99.Caption := ModuloDatos.TablaCentroTrabajoLinea2.AsString;
      QRLabel96.Caption := ModuloDatos.TablaCentroTrabajoLinea3.AsString;
      QRLabel2.Caption:=ModuloDatos.TablaPacientesAPELLIDOS.AsString;
      QRLabel4.Caption:=ModuloDatos.TablaPacientesNOMBRE.AsString;
      QRLabel6.Caption:=ModuloDatos.TablaPacientesDIRECCION.AsString;
      QRLabel8.Caption:=ModuloDatos.TablaPacientesPROVINCIA.AsString;
      QRLabel10.Caption:=ModuloDatos.TablaPacientesCIUDAD.AsString;
      QRLabel12.Caption:=ModuloDatos.TablaPacientesPOSTAL.AsString;
      QRLabel14.Caption:=ModuloDatos.TablaPacientesFECHA.AsString;
      QRLabel16.Caption:=ModuloDatos.TablaPacientesTELEFONO.AsString;
      QRLabel17.Caption:=ModuloDatos.TablaPacientesFAX.AsString;
      QRLabel26.Caption:=ModuloDatos.TablaPacientesCORREO.AsString;
    end;

    Screen.Cursor := crHourGlass;
    FormImprimePaciente.PrnPaciente.Prepare;
    FormImprimePaciente.PrnPaciente.Print;
  finally
    // método rudimentario para saber cuando terminó de crearse el archivo
    while not FileExists(RutaGuardar+'\'+NombreFichero+'.pdf') do
      Application.ProcessMessages;
    // Cerramos el monitor
    PdfCreator.cClose;
    PdfCreator := Unassigned;
  end;
  Screen.Cursor := crDefault;
  FormPrincipal.KillTask('PdfCreator.exe');
  FormImprimePaciente.PrnPaciente.PrinterSettings.PrinterIndex := OldPrinterIndex;

Como la versión de PDFcreator es antigua, al actualizar a la 2.3, que ahora mismo es la ultima, me lanza una ventana de error diciendo " Cadena clase no valida", porque habran cambiado los parametros que se pasan como opciones al objeto OLE.
Lo que hacia es generar el documento sin que la ventana de creación apareciera en pantalla y quiero que siga así....
Como identificaria la version del pdfcreator para que no pase esto, o mejor... que parametros son los que necesita ahora??
Gracias.

roman 09-10-2016 01:42:23

¡Dios! ¡Qué viejo estoy! No recuerdo esto :confused: Supongo que puedes buscar la cadena PDFCreator en el registro de windows para ver cuál es la cadena exacta.

LineComment Saludos

tarco35 09-10-2016 19:40:27

busqueda
 
Que tengo que buscar? porque he mirado con el regedit buscando PDFCreator y no veo nada que se parezca a parametros o cosas asi

TOPX 10-10-2016 23:35:57

Hola, tiene que buscar la documentación oficial de PdfCreator. Ahí encontré que:
Cita:

The old COM Interface (v1.7.*) consisted of three different objects: the clsPDFCreator object, the clsPDFCreatorOptions and the clsPDFCreatorError.

In opposite to that, the new COM Interface (v2.*) has five different objects: the Queue object, the PrintJob object, the PDFCreatorObj object, the Printers object, the OutputFiles object.
Fuente: Migrating from PDFCreator 1.7 to 2.0 - PDFCreator 2.3.2 documentation
-

tarco35 12-10-2016 21:09:14

no se
 
He estado mirando el enlace... y no lo entiendo...
Si hay alguien que sea capaz de comprenderlo, al principio puse el.codigo que uso... si puede traducirlo a las.sentencias nuevas... porque yo no lo veo
Resumiendo, que pdfcreator no te daque.ninguna ventana y pasarle el nombre de archivo que va a generar el qreport

golf2008 06-12-2017 20:58:50

Hola Tarco, actualmente tengo el mismo problema que planteaste en este hilo.

Le encontraste la solución ??

Lo que yo hago es desinstalar la nueva versión, e reinstalar la vieja.

No pude encontrar una solución a este problema.

Saludos

manelb 08-05-2018 21:20:16

Saludos a todos...

No se si alguien ha solucionado este tema, pero yo lo estoy revisando ahora.

He conseguido evitar el error de esta linea

Código Delphi [-]
PdfCreator := CreateOLEOBject('PDFCreator.clsPDFCreator');

cambiándola por esta otra encontrada en un ejemplo de VB

Código Delphi [-]
PdfCreator := CreateOLEObject('PDFCreator.PDFCreatorObj');

pero a continuación se produce un error en todas las siguientes

Código Delphi [-]
    PdfCreator.cStart();
    PdfCreator.cOption('UseAutosave') := 1;
    PdfCreator.cOption('UseAutosaveDirectory') := 1;
    PdfCreator.cOption('AutosaveDirectory') := RutaGuardar;
    PdfCreator.cOption('AutosaveFilename') := NombreFichero; // la extensión es opcional
    PdfCreator.cOption('AutosaveFormat') := 0; // PDF format

con el mensaje: "Method cStart not supoorted by automation object."


¿ Alguna idea ?

Sigo investigando ....

QuiqueSalamanca 09-05-2018 09:45:27

Cita:

Empezado por manelb (Mensaje 526115)
Saludos a todos...

No se si alguien ha solucionado este tema, pero yo lo estoy revisando ahora.

He conseguido evitar el error de esta linea

Código Delphi [-]
PdfCreator := CreateOLEOBject('PDFCreator.clsPDFCreator');

cambiándola por esta otra encontrada en un ejemplo de VB

Código Delphi [-]
PdfCreator := CreateOLEObject('PDFCreator.PDFCreatorObj');

pero a continuación se produce un error en todas las siguientes

Código Delphi [-]
    PdfCreator.cStart();
    PdfCreator.cOption('UseAutosave') := 1;
    PdfCreator.cOption('UseAutosaveDirectory') := 1;
    PdfCreator.cOption('AutosaveDirectory') := RutaGuardar;
    PdfCreator.cOption('AutosaveFilename') := NombreFichero; // la extensión es opcional
    PdfCreator.cOption('AutosaveFormat') := 0; // PDF format

con el mensaje: "Method cStart not supoorted by automation object."


¿ Alguna idea ?

Sigo investigando ....

Buenas, prueba esto:

Código Delphi [-]
OldPrinterIndex := FormImprimePaciente.PrnPaciente.PrinterSettings.PrinterIndex;
  FormImprimePaciente.PrnPaciente.PrinterSettings.PrinterIndex := PrinterIndex;
  PdfCreator := CreateOLEOBject('PDFCreator.JobQueue'); //La cola de impresion
  try
    PdfCreator.Initialize(); //Empieza la guerra    

    FormImprimePaciente.PrnPaciente.ReportTitle := 'BIA_Test: Datos Paciente';
    With FormImprimePaciente Do begin
      If FileExists(ModuloDatos.TablaCentroTrabajoNombreLogo.AsString) then
        QRLogo.Picture.LoadFromFile(ModuloDatos.TablaCentroTrabajoNombreLogo.AsString)
      Else QRLogo.Picture := nil;
      QRLogo.Stretch := ModuloDatos.TablaCentroTrabajoAjusteLogo.AsBoolean;
      QRLabel94.Caption := ModuloDatos.TablaCentroTrabajoNombre1.AsString;
      QRLabel24.Caption := ModuloDatos.TablaCentroTrabajoNombre2.AsString;
      QRLabel95.Caption := ModuloDatos.TablaCentroTrabajoLinea1.AsString;
      QRLabel99.Caption := ModuloDatos.TablaCentroTrabajoLinea2.AsString;
      QRLabel96.Caption := ModuloDatos.TablaCentroTrabajoLinea3.AsString;
      QRLabel2.Caption:=ModuloDatos.TablaPacientesAPELLIDOS.AsString;
      QRLabel4.Caption:=ModuloDatos.TablaPacientesNOMBRE.AsString;
      QRLabel6.Caption:=ModuloDatos.TablaPacientesDIRECCION.AsString;
      QRLabel8.Caption:=ModuloDatos.TablaPacientesPROVINCIA.AsString;
      QRLabel10.Caption:=ModuloDatos.TablaPacientesCIUDAD.AsString;
      QRLabel12.Caption:=ModuloDatos.TablaPacientesPOSTAL.AsString;
      QRLabel14.Caption:=ModuloDatos.TablaPacientesFECHA.AsString;
      QRLabel16.Caption:=ModuloDatos.TablaPacientesTELEFONO.AsString;
      QRLabel17.Caption:=ModuloDatos.TablaPacientesFAX.AsString;
      QRLabel26.Caption:=ModuloDatos.TablaPacientesCORREO.AsString;
    end;

    Screen.Cursor := crHourGlass;
    FormImprimePaciente.PrnPaciente.Prepare;
    FormImprimePaciente.PrnPaciente.Print;

    if not ( PdfCreator.WaitForJob( 15 ) ) then //15 segundos de espera para que llegue a la cola
      ShowMessage( 'El trabajo no ha llegado a la cola de impresión después de 15 segundos.' );

    oTrabajo := PdfCreator.NextJob; //Obtenemos el trabajo de impresión
   
    oTrabajo.SetProfileByGuid( 'DefaultGuid' ); //DefaultGuid crea un PDF normal...

    oTrabajo.ConvertTo( RutaGuardar+'\'+NombreFichero+'.pdf' ); //Convertimos el trabajo, debe ser la ruta con el nombre del PDF CON EXTENSION!
   
   if ( not  oTrabajo.IsFinished )     or      //Si no ha terminado o no ha tenido exito
      ( not  oTrabajo.IsSuccessful ) then
     raise Exception.Create( 'Error al convertir' );


  finally
  // Cuidado que puede quedarse en bucle... 
  // método rudimentario para saber cuando terminó de crearse el archivo
    while not FileExists(RutaGuardar+'\'+NombreFichero+'.pdf') do
      Application.ProcessMessages;
    // Cerramos el monitor
    PdfCreator.cClose;
    PdfCreator := Unassigned;
  end;
  Screen.Cursor := crDefault;
  FormPrincipal.KillTask('PdfCreator.exe');
  FormImprimePaciente.PrnPaciente.PrinterSettings.PrinterIndex := OldPrinterIndex;

Nota: la variable oTrabajo debe ser del mismo tipo que el objeto PdfCreator

Ya nos dices!

manelb 09-05-2018 18:30:34

Gracias Quique.
Con tus indicaciones y la ayuda de todos parece que finalmente lo he conseguido.

He tenido que hacer algunas pequeñas variaciones para que tu codigo me funcione, pero supongo que debe ser por las diferentes versiones del PDFCreator.

Por ejemplo:
1.-He cambiado
Código Delphi [-]
PdfCreator.Initialize();
por
Código Delphi [-]
PdfCreator.Initialize;
sin parentesis. Con paréntesisi me daba error.

2.- He tenido algun problema con
Código Delphi [-]
oTrabajo.ConvertTo( RutaGuardar+'\'+NombreFichero+'.pdf' );
Hasta que he descubierto que la ruta es sensible a mayúsculas/minúsculas.

3.-Esta línea también me daba error
Código Delphi [-]
PdfCreator.cClose;
y la he substituido por

Código Delphi [-]
PDFCreator.ReleaseCom;

tal y como he visto que recomendaban en la documentación oficial que comentaba el compañero TOPX más arriba.

4.-Otra cuestión que me ha entretenido ha sido conseguir que no se abriera el pdf una vez creado.
Lo he conseguido con
Código Delphi [-]
oTrabajo.SetProfileSetting('OpenViewer','False');
teniendo en cuenta que el parámetro booleano se tenia que passar como string. :confused:

Bien..., creo que eso es todo.
Gracias a todos por la ayuda.

QuiqueSalamanca 09-05-2018 18:38:35

De nada hombre!

Yo te lo escribí en cinco minutos sin poder probar nada, solo con lo que leí en la ayuda!

Me alegro que lo hayas conseguido!


La franja horaria es GMT +2. Ahora son las 03:35:58.

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