PDF reihenweise sortiert ausdrucken

  • Access

    PDF reihenweise sortiert ausdrucken

    Hallo,

    ich möchte eine ganze Reihe von PDF's ausdrucken, die auch sortiert aus dem Drucker kommen sollen.
    Der reine Aufruf mit ShellExecute führt dazu, dass einige Dateien "verschluckt" werden.
    CreateProcess mit WaitForSingleObject führt dazu, das alle PDF ausgedruckt werden, aber die Druckreihenfolge hat nichts mit der
    Reihenfolge der Aufrufe zu tun.
    Zuerst wird der kpl. Code abgearbeitet, dann druckt Windows die PDF's in einer Reihenfolge, die ich nicht nachvollziehen kann.
    Die u.g. Funktion rufe ich in einer Schleife durch das Recordset auf.
    Eigentlich hatte ich erwartet, daß der Code die nächste Datei erst dann aufruft, wenn das Acrobat-Fenster geschlossen ist.
    Dem ist aber nicht so.

    Visual Basic-Quellcode

    1. Function fktWaitForPDF(Aktion As String, stDatei) As Boolean
    2. Dim ProcInfo As PROCESS_INFORMATION, StartInfo As STARTUPINFO
    3. 'Aktion = "C:\Program Files\Adobe\Acrobat 8.0\Acrobat\Acrobat.exe /P "
    4. With StartInfo
    5. .cb = Len(StartInfo) ' Größe der Struktur übergeben
    6. .dwFlags = STARTF_USESHOWWINDOW ' Angeben, dass .wShowWindow benutzt wird
    7. .wShowWindow = 1 ' Fensterstil setzen
    8. End With
    9. If CreateProcess(0&, Aktion & stDatei, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, StartInfo, ProcInfo) = 0 Then
    10. MsgBox "CreateProcess konnte Acrobat.exe nicht ausführen."
    11. End If
    12. While WaitForSingleObject(ProcInfo.hProcess, 0) = WAIT_TIMEOUT
    13. DoEvents ' Zeitscheibe fortführen, danach Kontrolle an Windows
    14. Wend
    15. End Function

    Hier läufts genauso ab. Code läuft durch, dann werden die Fenster
    geöffnet und gedruckt, schön eines nach dem anderen nur die Reihenfolge
    stimmt nicht mit der des Funktionsaufrufes.

    Visual Basic-Quellcode

    1. Function fktWaitForPDF(Aktion As String, stDatei) As Boolean
    2. ' Startoptionen festlegen
    3. With ShExInfo
    4. .cbSize = Len(ShExInfo)
    5. '.fMask = SEE_MASK_FLAG_NO_UI Or SEE_MASK_CLASSNAME Or SEE_MASK_NOCLOSEPROCESS
    6. .hwnd = Me.hwnd
    7. .lpVerb = Aktion
    8. .lpFile = stDatei
    9. .lpParameters = ""
    10. .lpDirectory = DirName
    11. .nShow = SW_SHOWMAXIMIZED
    12. End With
    13. ' Programm ausführen
    14. Retval = ShellExecuteEx(ShExInfo)
    15. If Retval = 0 Then
    16. ' bei Fehler Text ausgeben
    17. Select Case ShExInfo.hInstApp
    18. Case SE_ERR_ACCESSDENIED
    19. Err.Raise 5, "ShellExecuteEx", "Zugriff verweigert"
    20. Case SE_ERR_FNF
    21. Err.Raise 5, "ShellExecuteEx", "Datei nicht gefunden"
    22. Case SE_ERR_NOASSOC
    23. Err.Raise 5, "ShellExecuteEx", "Datei ist mit keinem Programm verknüpft"
    24. End Select
    25. fktWaitForPDF = False
    26. Else
    27. 'erfolgreich gedruckte Datei löschen
    28. fktWaitForPDF = True
    29. End If
    30. ' warten bis die Anwendung beendet wird
    31. test = WaitForSingleObject(ShExInfo.hProcess, INFINITE)
    32. Do While test = 1
    33. test = WaitForSingleObject(ShExInfo.hProcess, INFINITE)
    34. Loop
    35. End Function


    Ich hoffe es gibt eine Möglichkeit, ohne dass der Benutzer jede Datei einzeln bestätigen muß.

    Gruß Matthias Fitzner