Hola, de nuevo, a TODOS.
Hace un tiempo dejé por aquí unos apuntes sobre la creación de PDF's desde C3. Bueno pues he seguido con el tema ya que no me hice caso a mí mismo y traté de hacerlos funcionar por otro método. Me explico. Yo dejé aquí una rutina que accedia a VBS desde C3 y inicializaba PDFCreator y FUNCIONABA!!!, pero tambien encontré en la WEB otra que hablaba de hacer lo mismo modificando el registro de windows; MENTIRA!!!!!!!!!!!!!!!......
Si os encontrais este 'truco-trucho' NO lo utiliceis ya que hace que PDFCreator funcione cuando le parece, os volverá locos y no conseguireis que trabaje de una forma estable.
No voy a poner la rutina-trucha porque no funciona.
A continuación os cuento el resultado que 'parece' que SI funciona:
/* --------------------- */
FUNCTION StorePDFOptions( lShow, cDirectory, cFileName, cPDFPrinter ) AS Logical
DEFAULT lShow TO False, cPDFPrinter TO "PDFTrueGEx"
WITH CreateObject( "MSScriptControl.ScriptControl" )
:Language := "VBScript"
:Reset()
:AddCode( 'Function StorePDFOptions()' + CRLF +;
' Dim PDFCreator' + CRLF +;
' Set PDFCreator = CreateObject("PDFCreator.clsPDFCreator")' + CRLF +;
' PDFCreator.cStart "/NoProcessingAtStartup"' + CRLF +;
' WITH PDFCreator' + CRLF +;
' .cOption("UseAutosave") = 1' + CRLF +;
' .cOption("UseAutosaveDirectory") = 1' + CRLF +;
' .cOption("AutosaveFormat") = 0' + CRLF +;
' .cOption("NoConfirmMessageSwitchingDefaultPrinter") = 1' + CRLF +;
' .cOption("AutosaveDirectory")="' + cDirectory + '"' + CRLF +;
' .cOption("AutosaveFilename")="'+ cFileName + '"' + CRLF +;
' .cSaveOptions' + CRLF +;
' .cClose' + CRLF +;
' End With' + CRLF +;
'End Function' )
:ExecuteStatement("StorePDFOptions")
estroy()
ENDWITH
RETURN True
Este primer paso hace que PDFCreator reciba los parámetros adecuados y podamos continuar.
Conectamos con PDFCreator
oPDFCreator := CreateOleObject( "PDFCreator.clsPDFCreator" )
IF !oPDFCreator:cStart( "/NoProcessingAtStartup" )
oPDFCreator:Destroy()
? "ya esta ejecutandose PDFCreator"
ENDIF
Abrimos el documento Word que queremos convertir (ya se que a partir de ofiice 2007 viene integrado el guardar como pdf, pero no este el caso)
oWord := CreateOleObject( "Word.Application" )
IF IsNil( oPDFCreator )
oWord:Destroy()
? "Word no está"
ENDIF
y ahora el 'mogollon'
oPDFCreator:cClearCache()
oWord:Visible := False
cDefaultPrinter := oWord:ActivePrinter
oWord:ActivePrinter := "PDFTrueGEx"
oDoc := oWord:Documents:Open( cArchivoOrigen )
oPDFCreator:cPrinterStop := True
oWord:ActiveDocument:PrintOut()
WHILE oWord:BackgroundPrintingStatus <> 0
Sleep( 10 )
DO EVENTS
END
oPDFCreator:cPrinterStop := False
oWord:ActivePrinter := cDefaultPrinter
cOutputFilename := oPDFCreator:cOutputFilename
PDFCreatorWait( cOutputFilename )
Esta última funcion es importante:
/*
----------------------------------------------------------------------------
Espera un tiempo determinado o hasta que el archivo PDF esta disponible
----------------------------------------------------------------------------
*/
FUNCTION PDFCreatorWait( cOutputFilename ) AS VOID
LOCAL nSeconds AS NUMBER
nSeconds := Seconds() + 30
WHILE !File( cOutputFilename ) .AND. ( Seconds() <= nSeconds )
DO EVENTS
END
RETURN
Y para terminar:
oPDFCreator:cClose()
oPDFCreator:Destroy()
oDoc:Close( 0 )
oWord:Quit( 0 )
oWord:Destroy()
oDlg:Destroy()
RestorePDFOptions()
Esta última lo que hace es dejar PDFCreator en su estado 'natural'
FUNCTION RestorePDFOptions() AS VOID
WITH CreateObject( "MSScriptControl.ScriptControl" )
:Language := "VBScript"
:Reset()
:AddCode( 'Function RestorePDFOptions()' + CRLF +;
' Dim PDFCreator' + CRLF +;
' Set PDFCreator = CreateObject("PDFCreator.clsPDFCreator")' + CRLF +;
' PDFCreator.cStart "/NoProcessingAtStartup"' + CRLF +;
' WITH PDFCreator' + CRLF +;
' .cOption("UseAutosave") = 0' + CRLF +;
' .cOption("UseAutosaveDirectory") = 1' + CRLF +;
' .cOption("AutosaveFormat") = 0' + CRLF +;
' .cOption("NoConfirmMessageSwitchingDefaultPrinter") = 0' + CRLF +;
' .cOption("AutosaveDirectory") = "<MyFiles>\"' + CRLF +;
' .cOption("AutosaveFilename") = "<DateTime>"' + CRLF +;
' .cSaveOptions' + CRLF +;
' .cClose' + CRLF +;
' End With' + CRLF +;
'End Function' )
:ExecuteStatement("RestorePDFOptions")
estroy()
ENDWITH
RETURN
Bueno, estas son mis experiencias......