# PDF-Dateien automatisch drucken



## cameeel (4. Mai 2009)

Hallo Leute,

ich suche ein Möglichkeit wie ich unter Windows beliebig viele PDF-Dateien (derzeit etwa 1.300) automatisch drucken lassen kann.

Ansatz (Batch):

```
@for %%p in ("H:\xampplite\htdocs\bookdbs\trunk\static\bestellzettel\*.pdf") do "C:\Program Files\Adobe\Acrobat 7.0\Reader\AcroRd32.exe" /p %%p
```
Der Code funktioniert soweit. Einzige Probleme:
* Acrobat Reader verlangt eine Bestätigung um den Druckvorgang zu starten
* Acrobat Reader schließt sich nicht wieder automatisch

Hintergrundinformationen:
* PDF's werden automatisch mit PHP/LaTeX erstellt.

Danke für eure Hilfe, es muss übrigens nicht zwangsläufig Batch sein.

Gruß.


----------



## ronaldh (4. Mai 2009)

Unter VB nutze ich dafür die API-Funktion ShellExecute. Das funktioniert einwandfrei, man muss nach dem Druck nur in einer Schleife prüfen, ob das Acrobat Fenster noch offen ist.


----------



## cameeel (5. Mai 2009)

Könntest du mir bitte den entsprechenden Code zur Verfügung stellen?


----------



## ronaldh (5. Mai 2009)

Wie gesagt, ich mache das in VB6. Das sollte aber in VBScript auch so ähnlich möglich sein.

Hiermit wird der Ausdruck durchgeführt, und der Acrobat Reader hinterher geschlossen:


```
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Const WM_CLOSE = &H10
Const SW_SHOWNORMAL = 1
Const SW_SHOWMINIMIZED As Long = 2
Const SW_HIDE As Long = 0

Private Sub PrintPDF(FileName as String) 

Dim Ausdruck As Boolean
Dim WinWnd As Long
Dim b as Long

Ausdruck = ShellExecute(Me.hwnd, "print", Filename, vbNullString, vbNullString, SW_HIDE)
DoEvents
Sleep 2000                    '2 Sekunden warten

Do While WinWnd = 0
   b = b + 1                '' Schleife, Adobee druckt wohl noch
   DoEvents
   WinWnd = FindWindow(vbNullString, "Adobe Reader")
   DoEvents
   If b > 3000 Then      'Gucken, ob Adobe Reader mit Datei geöffnet ist (GetFileFromPath ist eine kleine Funktion, die den Dateinamen ohne Pfad zurück gibt)
      WinWnd = FindWindow(vbNullString, "Adobe Reader - [" & GetFileFromPath(Filename) & "]")
   Else
      WinWnd = FindWindow(vbNullString, "Adobe Reader")
   End If
   If b > 9000 Then   '.Adobe Reader nicht da, ist wohl schon beendet
      Exit Do
   End If
Loop

If b <= 9000 Then    '. . . . . . . Acrobat Reader schließen
   PostMessage WinWnd, WM_CLOSE, 0&, 0&
End If


End Sub
```

Ich hoffe, Du kommst damit weiter. Da das ganze bei mir Teil einer komplexen Funktion ist, habe ich hier nur die relevanten Teile raus geholt.

Grüsse
ronaldh


----------



## cameeel (6. Mai 2009)

Werde ich mir in den nächsten Tagen genauer ansehen, danke.


----------

