PDA

Ver la Versión Completa : Error al actualizar PDFcreator


tarco35
08-10-2016, 21:01:28
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):

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, 00: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, 18:40:27
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, 22:35:57
Hola, tiene que buscar la documentación oficial de PdfCreator. Ahí encontré que:
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 (http://docs.pdfforge.org/pdfcreator/2.3/en/pdfcreator/com-interface/user-manual/basics/workflow-comparsion-v1-7-v2/)
-

tarco35
12-10-2016, 20:09:14
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, 19: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, 20: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


PdfCreator := CreateOLEOBject('PDFCreator.clsPDFCreator');


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


PdfCreator := CreateOLEObject('PDFCreator.PDFCreatorObj');


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


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, 08:45:27
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


PdfCreator := CreateOLEOBject('PDFCreator.clsPDFCreator');


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


PdfCreator := CreateOLEObject('PDFCreator.PDFCreatorObj');


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


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:

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, 17: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
PdfCreator.Initialize();
por
PdfCreator.Initialize;
sin parentesis. Con paréntesisi me daba error.

2.- He tenido algun problema con
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
PdfCreator.cClose;
y la he substituido por

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
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, 17: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!