Hi,
ich versuche aus einem PDF-Dokument Tiffs zu generieren, indem ich jede Seite einzeln auf den Microsoft Office Document Image Writer drucke. Dazu splitte ich mir die PDF in Einzelseiten (dazu nutze ich PDF Split And Merge aber das nur nebenbei) und rufe dann eine entsprechende Funktion auf, die so aussieht:
[highlight=vbnet]
...
Function PrintFilesToTiff(ByVal FilePath as String) As Boolean
...
Dim dateien as String() = IO.Directory.GetFiles(FilePath)
Dim oldPrinter As String = GetDefaultPrinterName()
If Not SetDefaultPrinter("Microsoft Office Document Image Writer") Then
ShowInternalError("Das Programm kann den TIFF-Drucker nicht finden." & vbCrLf & "Bitte beheben Sie das Problem oder informieren Sie einen Administrator.")
SetDefaultPrinter(oldPrinter)
Return False
End If
Dim pd As New PrintDocument()
Try
For Each dateiname As String In dateien
Dim dummyFilename As String = IO.Path.GetFileNameWithoutExtension(dateiname)
Dim Blattnummer As Integer = zahl.getLng(strPart(dummyFilename, 2, "BX"))
pd.PrinterSettings.PrintFileName = strPart(dateiname, 1, "BX") & "B" & Blattnummer.ToString("00") & "_A4.tif"
PDFDrucken(dateiname)
strCat(FileList, dateiname, ",")
Next
Catch ex As Exception
ShowInternalError("Ausnahmebehandlung beim Drucken der TIFFs: " & ex.Message & vbCrLf & vbCrLf & ex.StackTrace())
Return False
Finally
SetDefaultPrinter(oldPrinter)
End Try
...
Return True
End Function
Public Sub PDFDrucken(ByVal pFilename As String)
Try
Dim f As String = IIf(InStr(pFilename, " ") > 0, Chr(34) & pFilename & Chr(34), pFilename)
Dim starter As New ProcessStartInfo(GetPDFPrintExe(), " /p /h " & f) '"/T " & f
Dim pro As New Process
pro.StartInfo = starter
pro.StartInfo.UseShellExecute = True
pro.Start()
Wait(3)
Dim hAcrobatWindow As IntPtr
Do
hAcrobatWindow = pro.MainWindowHandle
If hAcrobatWindow = 0 Then Exit Do 'Prozess hat kein Fenster (mehr) -> Prozess ist bereits beendet
If PostMessage(hAcrobatWindow, WM_CLOSE, 0, 0) = 0 Then
clsLog.LogLine("PostMessage an AcrobatReader fehlgeschlagen:" & Err.LastDllError & " - " & Err.Description)
End If
pro.WaitForExit(1000)
Loop While Not pro.HasExited
Catch ioex As InvalidOperationException
clsLog.LogLine("PDFDrucken: Handle des Acrobat Fensters erfragen fehlgeschlagen, Prozess bereits beendet.")
Catch ex As Exception
ShowError("Ein Fehler ist aufgetreten:" & ex.Message & vbCrLf & ex.StackTrace)
Finally
'Speicher aufräumen
GC.Collect()
GC.WaitForPendingFinalizers()
End Try
End Sub
[/highlight]
Anscheinend reicht es aber nicht, nach der Umstellung auf den Image Writer PrinterSettings.PrintFileName zu setzen, denn ich erhalte trotzdem einen Dateidialog, in dem ich einen Dateinamen angeben muss, und selbst der ist der Dateiname der ursprünglichen PDF-Datei, nur halt mit tif als Endung.
Muss ich irgendwie die PrinterSettings, die ich in meinem pd umsetze "zurückpropagieren", damit die Einstellung für den Aufruf in PDFDrucken verfügbar ist, und wenn ja, wie mache ich das, oder hängt da irgendwo noch ein ganz anderer Denkfehler drin, und ich kann den Dateiauswahldialog gar nicht umgehen?
Mit freundlichen Grüßen
Martin Dietz
ich versuche aus einem PDF-Dokument Tiffs zu generieren, indem ich jede Seite einzeln auf den Microsoft Office Document Image Writer drucke. Dazu splitte ich mir die PDF in Einzelseiten (dazu nutze ich PDF Split And Merge aber das nur nebenbei) und rufe dann eine entsprechende Funktion auf, die so aussieht:
[highlight=vbnet]
...
Function PrintFilesToTiff(ByVal FilePath as String) As Boolean
...
Dim dateien as String() = IO.Directory.GetFiles(FilePath)
Dim oldPrinter As String = GetDefaultPrinterName()
If Not SetDefaultPrinter("Microsoft Office Document Image Writer") Then
ShowInternalError("Das Programm kann den TIFF-Drucker nicht finden." & vbCrLf & "Bitte beheben Sie das Problem oder informieren Sie einen Administrator.")
SetDefaultPrinter(oldPrinter)
Return False
End If
Dim pd As New PrintDocument()
Try
For Each dateiname As String In dateien
Dim dummyFilename As String = IO.Path.GetFileNameWithoutExtension(dateiname)
Dim Blattnummer As Integer = zahl.getLng(strPart(dummyFilename, 2, "BX"))
pd.PrinterSettings.PrintFileName = strPart(dateiname, 1, "BX") & "B" & Blattnummer.ToString("00") & "_A4.tif"
PDFDrucken(dateiname)
strCat(FileList, dateiname, ",")
Next
Catch ex As Exception
ShowInternalError("Ausnahmebehandlung beim Drucken der TIFFs: " & ex.Message & vbCrLf & vbCrLf & ex.StackTrace())
Return False
Finally
SetDefaultPrinter(oldPrinter)
End Try
...
Return True
End Function
Public Sub PDFDrucken(ByVal pFilename As String)
Try
Dim f As String = IIf(InStr(pFilename, " ") > 0, Chr(34) & pFilename & Chr(34), pFilename)
Dim starter As New ProcessStartInfo(GetPDFPrintExe(), " /p /h " & f) '"/T " & f
Dim pro As New Process
pro.StartInfo = starter
pro.StartInfo.UseShellExecute = True
pro.Start()
Wait(3)
Dim hAcrobatWindow As IntPtr
Do
hAcrobatWindow = pro.MainWindowHandle
If hAcrobatWindow = 0 Then Exit Do 'Prozess hat kein Fenster (mehr) -> Prozess ist bereits beendet
If PostMessage(hAcrobatWindow, WM_CLOSE, 0, 0) = 0 Then
clsLog.LogLine("PostMessage an AcrobatReader fehlgeschlagen:" & Err.LastDllError & " - " & Err.Description)
End If
pro.WaitForExit(1000)
Loop While Not pro.HasExited
Catch ioex As InvalidOperationException
clsLog.LogLine("PDFDrucken: Handle des Acrobat Fensters erfragen fehlgeschlagen, Prozess bereits beendet.")
Catch ex As Exception
ShowError("Ein Fehler ist aufgetreten:" & ex.Message & vbCrLf & ex.StackTrace)
Finally
'Speicher aufräumen
GC.Collect()
GC.WaitForPendingFinalizers()
End Try
End Sub
[/highlight]
Anscheinend reicht es aber nicht, nach der Umstellung auf den Image Writer PrinterSettings.PrintFileName zu setzen, denn ich erhalte trotzdem einen Dateidialog, in dem ich einen Dateinamen angeben muss, und selbst der ist der Dateiname der ursprünglichen PDF-Datei, nur halt mit tif als Endung.
Muss ich irgendwie die PrinterSettings, die ich in meinem pd umsetze "zurückpropagieren", damit die Einstellung für den Aufruf in PDFDrucken verfügbar ist, und wenn ja, wie mache ich das, oder hängt da irgendwo noch ein ganz anderer Denkfehler drin, und ich kann den Dateiauswahldialog gar nicht umgehen?
Mit freundlichen Grüßen
Martin Dietz