Problem mit _WordDocPrint - Soll nicht aufs drucken warten

  • Mein Problem ist folgendes:
    Ich will eine Reihe Worddokumente in Pdf umwandeln, dazu wollte ich CC Pdf Converter und _WordDocPrint verwenden.

    Spoiler anzeigen
    [autoit]

    #include <Word.au3>
    #include <_GetFilesFolder_Rekursiv.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $s_progname = "pdf_umwandeln"
    $s_printername = 'CC PDF Converter'

    [/autoit] [autoit][/autoit] [autoit]

    $s_wordfilesdir = Inputbox($s_progname,"Bitte geben sie den Pfad zu ihren Worddateien an.")
    $a_wordfiles = _GetFilesFolder_Rekursiv($s_wordfilesdir, '.doc', 0, 0, '0')
    _ArrayDisplay ($a_wordfiles)

    [/autoit] [autoit][/autoit] [autoit]

    for $i = 1 to $a_wordfiles[0] Step 2
    msgbox(1,'bla','open')
    $o_WordApp = _WordCreate($a_wordfiles[$i],0,0,0)
    $o_Doc = _WordDocGetCollection($o_WordApp,0)
    msgbox(1,'bla','print')
    _WordDocPrint($o_Doc,1,1,-1,1,$s_printername)
    msgbox(1,'bla','wait')
    sleep(1000)
    msgbox(1,'bla','send')
    ControlSend('Select a filename to write into','','[CLASS:Edit; INSTANCE:1]',StringTrimRight ( $a_wordfiles[$i], 3 ) & 'pdf')
    msgbox(1,'bla','click')
    ControlClick('Select a filename to write into', '', '[CLASS:Button; INSTANCE:1]' )
    msgbox(1,'bla','wait')
    sleep(2000)
    msgbox(1,'bla','quit')
    _WordQuit($o_WordApp)
    next

    [/autoit]


    Das funktioniert so nicht, wie man an den Msgboxen sieht. _WordDocPrint bleibt, trotz der Anweisung nicht auf`s Drucken zu warten, stehen.
    Was mache ich falsch?

    Mfg,
    jendrik

    Einmal editiert, zuletzt von jendrik (20. Mai 2009 um 18:13)

    • Offizieller Beitrag

    Ich kenne diesen Converter nicht, ich verwende PDFCreator.
    Damit läßt sich das gut so automatisieren:

    [autoit]

    Local $FILE = "C:\Test_1.doc" ; kpl. Pfad der zu druckenden Datei
    Local $oPDFCreator = ObjCreate("PDFCreator.clsPDFCreator")
    If Not IsObj($oPDFCreator) Then Exit MsgBox(0, 'Fehler', 'Objekterstellung fehlgeschlagen.')
    $oPDFCreator.cStart("/NoProcessingAtStartup")
    With $oPDFCreator
    .cOption("AutosaveFormat") = 0 ; 0 = PDF
    $DefaultPrinter = .cDefaultprinter
    .cDefaultprinter = "PDFCreator"
    .cClearcache
    .cPrinterStop = False
    If Not FileExists($FILE) Then Exit MsgBox(0, 'Fehler', 'Datei existiert nicht.')
    If Not .cIsPrintable($FILE) Then Exit MsgBox(0, 'Fehler', 'Datei ist nicht druckbar.')
    .cPrintfile($FILE)
    .cDefaultprinter = $DefaultPrinter
    .cClearcache
    Sleep(200)
    .cClose
    EndWith

    [/autoit]
    • Offizieller Beitrag

    Hi,
    ich hab mal auf die Commandlinevariante gewechselt. Ist etwas einfacher zu händeln.
    Die Registryschlüssel beziehen sich auf die Standardinstallation. Bei Serverinstallation entsprechend anpassen - s. PDFCreator-Hilfe.

    Edit: Noch einen Bug gefixt. :D

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    Local $SourceFolder = 'C:\TEST_ONLY\' ; Quellordner, abschließender Backslash - sonst Fehler bei RunWait!
    Local $TargetFolder = $SourceFolder & 'PDF_OUT' ; Ausgabeordner
    If Not FileExists($TargetFolder) Then DirCreate($TargetFolder)

    [/autoit] [autoit][/autoit] [autoit]

    Local $TargetFormat = 0 ; values: ' 0 = PDF, 1 = PNG, 2 = JPEG, 3 = BMP, 4 = PCX, 5 = TIFF, 6 = PS, 7 = EPS, 8 = TXT,
    ;~ 9 = PDF/A-1b, 10 = PDF/X, 11 = PSD, 12 = PCL, 13 = RAW
    Local $FileType = '*.doc' ; Quelldateityp
    Local $FileSaveName = '<Title>' ; oder folgende Attribute (auch kombinierbar '<Title><DateTime>' )
    ;~ <Author> - Der Ersteller/Autor eines Dokumentes. Dies muss nicht immer der angemeldete Benutzer sein.
    ;~ <Computername> - Der Name des Rechners, auf dem PDFCreator installiert wurde.
    ;~ <ClientComputer> - Der Name oder die IP-Adresse des Rechners, der den Druckauftrag erstellt hat.
    ;~ Liegt eine Standardinstallation vor, entspricht der Clientcomputer dem Computernamen.
    ;~ Wurde die Serverinstallation gewählt, ist der Clientcomputer der Rechner, der über die Freigabe
    ;~ des Druckers einen Druckauftrag erstellt hat. Der Token kann auch für das "Automatische Speichern"-
    ;~ Verzeichnis gewählt werden, um so direkt auf dem Rechner, der den Druckauftrag erstellt hat, ein Dokument
    ;~ zu speichern (Bsp.: "\\<ClientComputer>\c$\files").
    ;~ <DateTime> - Fügt das aktuelle Datum und die aktuelle Zeit ein.
    ;~ <Title> - Fügt den Dokumententitel ein.
    ;~ <Username> - Fügt den Benutzernamen des angemeldeten Benutzers ein.
    ;~ <Counter> - Ein Zähler der bis 922.337.203.685.477 zählt.
    ;~ <MyFiles> - Ist das Verzeichnis "Eigene Dateien" des Benutzers.
    ;~ <MyDesktop> - Steht für den Desktop des Benutzers.

    [/autoit] [autoit][/autoit] [autoit]

    ; Dateien einlesen
    Local $aFiles = _FileListToArray($SourceFolder, $FileType, 1)
    If @error Then Exit MsgBox(0, 'Fehler', 'Keine Datei des gesuchten Typs im Ordner.')

    [/autoit] [autoit][/autoit] [autoit]

    ; bestehende AutoSave-Option auslesen
    Local $key = "HKEY_CURRENT_USER\Software\PDFCreator\Program"
    Local $UseAutosave = RegRead($key, 'UseAutosave')

    [/autoit] [autoit][/autoit] [autoit]

    ; Optionen setzen
    RegWrite($key, 'UseAutosave', 'REG_SZ', 1)
    RegWrite($key, 'AutosaveDirectory', 'REG_SZ', $TargetFolder)
    RegWrite($key, 'AutosaveFilename', 'REG_SZ', $FileSaveName)
    RegWrite($key, 'AutosaveFormat', 'REG_SZ', $TargetFormat)

    [/autoit] [autoit][/autoit] [autoit]

    ; Drucken
    For $i = 1 To UBound($aFiles)-1
    RunWait(@ComSpec & " /c " & 'C:\Programme\PDFCreator\PDFCreator.exe /NOSTART /PF"' & $SourceFolder & $aFiles[$i] & '"', "", @SW_HIDE)
    Next
    Local $init = TimerInit()
    Do
    Sleep(50)
    Until (Not ProcessExists('PDFSpool.exe')) Or TimerDiff($init) > 1000

    [/autoit] [autoit][/autoit] [autoit]

    ; ursprüngliche AutoSave-Option zurückschreiben
    RegWrite($key, 'UseAutosave', 'REG_SZ', $UseAutosave)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, 'Convert2PDF', 'Abgeschlossen.')

    [/autoit]

    Edit2:
    Ich habe die Objektvariante nochmal verbessert. Probier einfach, was dir besser gefällt:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    Local $SourceFolder = 'C:\TEST_ONLY\' ; Quellordner, abschließender Backslash
    Local $TargetFolder = $SourceFolder & 'PDF_OUT' ; Ausgabeordner
    If Not FileExists($TargetFolder) Then DirCreate($TargetFolder)

    [/autoit] [autoit][/autoit] [autoit]

    Local $TargetFormat = 0 ; values: ' 0 = PDF, 1 = PNG, 2 = JPEG, 3 = BMP, 4 = PCX, 5 = TIFF, 6 = PS, 7 = EPS, 8 = TXT,
    ;~ 9 = PDF/A-1b, 10 = PDF/X, 11 = PSD, 12 = PCL, 13 = RAW
    Local $FileType = '*.doc' ; Quelldateityp
    Local $FileSaveName = '<Title>' ; oder folgende Attribute (auch kombinierbar '<Title><DateTime>' )
    ;~ <Author> - Der Ersteller/Autor eines Dokumentes. Dies muss nicht immer der angemeldete Benutzer sein.
    ;~ <Computername> - Der Name des Rechners, auf dem PDFCreator installiert wurde.
    ;~ <ClientComputer> - Der Name oder die IP-Adresse des Rechners, der den Druckauftrag erstellt hat.
    ;~ Liegt eine Standardinstallation vor, entspricht der Clientcomputer dem Computernamen.
    ;~ Wurde die Serverinstallation gewählt, ist der Clientcomputer der Rechner, der über die Freigabe
    ;~ des Druckers einen Druckauftrag erstellt hat. Der Token kann auch für das "Automatische Speichern"-
    ;~ Verzeichnis gewählt werden, um so direkt auf dem Rechner, der den Druckauftrag erstellt hat, ein Dokument
    ;~ zu speichern (Bsp.: "\\<ClientComputer>\c$\files").
    ;~ <DateTime> - Fügt das aktuelle Datum und die aktuelle Zeit ein.
    ;~ <Title> - Fügt den Dokumententitel ein.
    ;~ <Username> - Fügt den Benutzernamen des angemeldeten Benutzers ein.
    ;~ <Counter> - Ein Zähler der bis 922.337.203.685.477 zählt.
    ;~ <MyFiles> - Ist das Verzeichnis "Eigene Dateien" des Benutzers.
    ;~ <MyDesktop> - Steht für den Desktop des Benutzers.

    [/autoit] [autoit][/autoit] [autoit]

    ; Dateien einlesen
    Local $aFiles = _FileListToArray($SourceFolder, $FileType, 1)
    If @error Then Exit MsgBox(0, 'Fehler', 'Keine Datei des gesuchten Typs im Ordner.')

    [/autoit] [autoit][/autoit] [autoit]

    ; PDFCreator Objekt erstellen
    Local $oPDFCreator = ObjCreate("PDFCreator.clsPDFCreator")
    Local $EventObj = ObjEvent($oPDFCreator, 'PDFCreator_')

    [/autoit] [autoit][/autoit] [autoit]

    $oPDFCreator.cStart("/NoProcessingAtStartup")

    [/autoit] [autoit][/autoit] [autoit]

    With $oPDFCreator
    $DefaultPrinter = .cDefaultprinter
    .cDefaultprinter = "PDFCreator"
    .cClearcache
    .cPrinterStop = False
    .cOption('UseAutosave') = 1
    .cOption('AutosaveFormat') = $TargetFormat
    .cOption('UseAutosaveDirectory') = 1
    .cOption('AutosaveDirectory') = $TargetFolder
    .cOption('AutosaveFilename') = $FileSaveName
    EndWith

    [/autoit] [autoit][/autoit] [autoit]

    ; Dateien als PDF drucken
    For $i = 1 To UBound($aFiles) -1
    With $oPDFCreator
    If Not FileExists($SourceFolder & $aFiles[$i]) Then _end('Datei existiert nicht.')
    If Not .cIsPrintable($SourceFolder & $aFiles[$i]) Then _end('Datei ist nicht druckbar.')
    .cPrintfile($SourceFolder & $aFiles[$i])
    Do
    Sleep(20)
    Until .cIsConverted()
    .cIsConverted = False
    EndWith
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _end()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func PDFCreator_eError()
    $oErr = $oPDFCreator.cError
    _end($oErr.Number & ' : ' & $oErr.Description & @CRLF)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _end($msg = '')
    With $oPDFCreator
    .cPrinterStop = True
    .cDefaultprinter = $DefaultPrinter
    .cClearcache
    Sleep(200)
    .cClose
    EndWith
    If $msg Then
    Exit MsgBox(0, 'Fehler', $msg)
    Else
    Exit MsgBox(0, 'Convert2PDF', 'Abgeschlossen.')
    EndIf
    EndFunc

    [/autoit]
  • Vielen Dank,
    die Objektversion funktioniert 1a!
    Die Commandlinevariante aber nicht?!?
    Ich habe sowohl den Pfad zur Exe angepasst, als auch den Registrypfad überprüft, aber dennoch werden keine Dateien erstellt.
    Wäre interessant ob du eine Idee hast, aber eigentlich reicht auch eine funktionierende Version.
    Vielen Dank!

    Jendrik

    • Offizieller Beitrag

    In der Commandline Variante gibt es eigentlich nur zwei Fehlerquellen:
    - Regitryänderung wird nicht übernommen (am Besten Rückgabe von Regwrite auswerten) oder
    - fehlerhafte Angabe in RunWait:
    RunWait(@ComSpec & " /c " & 'C:\Programme\PDFCreator\PDFCreator.exe /NOSTART /PF"' & $SourceFolder & $aFiles[$i] & '"', "", @SW_HIDE)
    Next
    ==> hinter /PF darf kein Leerzeichen stehen!
    ==> Parameter Dateipfad in eigenen Gänsfüßchen:
    '..\PDFCreator.exe /NOSTART /PF"Dateipfad"'

  • hmm, soweit ich das überblicke stimmt alles, keine Leerstelle hinter dem /PF, Gänsefüßchen und Registry-Änderungen werden auch getätigt.

  • Hallo, bin neu hier und auch bei Autoit3. Gefällt mir sehr gut.

    Habe jetzt mal von BugFix das script für pdfcreator verwendet, funzt super, aber wenn MS-Word läuft, druckt er auf dem Standart Drucker und nicht nach PDFCreator.

    ist das so? gibts nen Weg drum rum, so dass er auch wenn Word läuft den PDFCreator als DefPrinter nimmt?

    Danke

    p_fekonja

    • Offizieller Beitrag

    Habe jetzt mal von BugFix das script für pdfcreator verwendet, funzt super, aber wenn MS-Word läuft, druckt er auf dem Standart Drucker und nicht nach PDFCreator.

    Das kann ich nicht nachvollziehen. Mit dieser Sequenz wird der aktuelle Drucker gespeichert und 'PDFCreator' als Standardrucker gesetzt.

    [autoit]

    With $oPDFCreator
    $DefaultPrinter = .cDefaultprinter
    .cDefaultprinter = "PDFCreator"
    .cClearcache
    .cPrinterStop = False
    .cOption('UseAutosave') = 1
    .cOption('AutosaveFormat') = $TargetFormat
    .cOption('UseAutosaveDirectory') = 1
    .cOption('AutosaveDirectory') = $TargetFolder
    .cOption('AutosaveFilename') = $FileSaveName
    EndWith

    [/autoit]
  • Danke für die schnelle Antwort.

    Hab mich falsch oder unverständlich ausgedrückt. ;(

    Wenn ich Word geöffnet habe und zB ein beliebiges Dokument bearbeite, und daneben das Prog mit Autoit ein PDF mit einer anderen Worddatei erstellen soll, dann druckt das Autoitscript nicht nach PDFCreator sondern auf den DefPrinter.

    Läuft kein Word, dann ist alles OK

    p_fekonja