使用文件系统观察器打印 png 文件 vb.net
printing png file with file system watcher vb.net
我正在尝试打印新创建的 png 文件。
我正在使用文件系统观察器在创建文件和获取文件路径时做出反应。
Private Sub FileSystemWatcher1_Created(sender As Object, e As FileSystemEventArgs) Handles FileSystemWatcher1.Created
Dim MyFile As String = e.FullPath.ToString
Try
AddHandler PrintDocument1.PrintPage, AddressOf Me.PrintImage
PrintDocument1.Print()
Catch ex As Exception
MsgBox(ex, MsgBoxStyle.Critical, "Error during Print")
End Try
End Sub
但是当我想打印它时,我不知道该路径如何直接指向来自 MSDN 的代码,就像这段代码 Me.PrintImage 和 Me.PrintImage(MyFile) returns 一样错误
WithEvents PrintDocument1 As New PrintDocument
Private Sub PrintImage(ByVal sender As Object, ByVal ppea As PrintPageEventArgs, MyFile As String)
ppea.Graphics.DrawImage(Image.FromFile(MyFile), ppea.Graphics.VisibleClipBounds)
ppea.HasMorePages = False
End Sub
我怎样才能将我的文件定向到此打印服务?我发现的代码基于文件的静态路径,不在文件系统观察器中,我似乎无法找到将它们联系在一起的方法。
请帮忙!
请考虑以下事项:
- 您不能更改 delegate/event 的签名,例如:
Private Sub PrintImage(ByVal sender As Object, ByVal ppea As PrintPageEventArgs, MyFile As String)
- 您始终可以声明 class 成员以在 class 中的任何位置访问它们。您可以像这样声明
MyFile
:
Public Class Form1
Private MyFile As String
End Class
现在您可以在 FileSystemWatcher1_Created
事件中为其分配值,并在 PrintImage
事件中读取该值。阅读更多:How to: Control the Scope of a Variable (Visual Basic)
- 您应该只订阅一次活动:
Public Class Form1
Private MyFile As String
Private PrintDocument1 As PrintDocument
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
PrintDocument1 = New PrintDocument
AddHandler PrintDocument1.PrintPage, AddressOf PrintImage
End Sub
Private Sub PrintImage(sender As Object, e As PrintPageEventArgs)
'...
End Sub
End Class
或者像在 FileSystemWatcher1_Created
事件中一样使用 WithEvents and Handles 子句。
Public Class Form1
Private MyFile As String
Private WithEvents PrintDocument1 As PrintDocument
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
PrintDocument1 = New PrintDocument
End Sub
Private Sub PrintImage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
'...
End Sub
End Class
或者使用设计器添加 PrintDocument
组件的实例并订阅它的事件。就像 FileSystemWatcher
组件一样。
把它们放在一起,你应该得到这样的东西:
Public Class Form1
Private MyFile As String
Private WithEvents PrintDocument1 As PrintDocument
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
PrintDocument1 = New PrintDocument
End Sub
Private Sub FileSystemWatcher1_Created(sender As Object, e As FileSystemEventArgs) Handles FileSystemWatcher1.Created
MyFile = e.FullPath
PrintDocument1.Print()
End Sub
Private Sub PrintImage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
If Not File.Exists(MyFile) Then
Return
End If
Try
Using bmp = New Bitmap(New MemoryStream(File.ReadAllBytes(MyFile)))
e.Graphics.DrawImage(bmp, e.Graphics.VisibleClipBounds)
End Using
Catch ex As ArgumentException
Console.WriteLine("Not Image!")
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Sub
Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs)
MyBase.OnFormClosed(e)
PrintDocument1.Dispose()
End Sub
End Class
恕我直言,一种更好的方法是将创建的文件收集在列表中,并将它们作为一个打印作业发送到打印机。当您在 FileSystemWatcher.Path
中粘贴多个文件时很有用。每个文件都会引发 FileSystemWatcher.Created
事件,并且还会为每个文件调用前面代码中的 PrintDocument.Print
方法。我们可以将执行相同任务的打印调用减少到一个。
下面的代码是一个快速的 Lambda-Expression-Way 示例。
Imports System.IO
Imports System.Windows.Forms
Imports System.Drawing.Printing
Imports System.Collections.Generic
Public Class Form1
Private ReadOnly watcher As FileSystemWatcher
Private ReadOnly timer As Timer 'System.Windows.Forms.Timer
Private ReadOnly printDoc As PrintDocument
Private MyFiles As Queue(Of String)
Sub New()
InitializeComponent()
MyFiles = New Queue(Of String)
watcher = New FileSystemWatcher With {
.Path = "PathToWatch",
.EnableRaisingEvents = True
}
AddHandler watcher.Created,
Sub(s, e)
If Not MyFiles.Contains(e.FullPath) Then
MyFiles.Enqueue(e.FullPath)
Invoke(Sub() timer.Start())
End If
End Sub
timer = New Timer With {.Interval = 1000}
AddHandler timer.Tick,
Sub(s, e)
timer.Stop()
printDoc.Print()
End Sub
printDoc = New PrintDocument
AddHandler printDoc.PrintPage,
Sub(s, e)
Dim imgFile = MyFiles.Dequeue
If Not File.Exists(imgFile) Then
Return
End If
Try
Using bmp = New Bitmap(New MemoryStream(File.ReadAllBytes(imgFile)))
e.Graphics.DrawImage(bmp, e.Graphics.VisibleClipBounds)
End Using
Catch ex As ArgumentException
Console.WriteLine("Not Image!")
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
e.HasMorePages = MyFiles.Count > 0
End Sub
End Sub
Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs)
MyBase.OnFormClosed(e)
watcher.Dispose()
timer.Dispose()
printDoc.Dispose()
End Sub
End Class
我正在尝试打印新创建的 png 文件。 我正在使用文件系统观察器在创建文件和获取文件路径时做出反应。
Private Sub FileSystemWatcher1_Created(sender As Object, e As FileSystemEventArgs) Handles FileSystemWatcher1.Created
Dim MyFile As String = e.FullPath.ToString
Try
AddHandler PrintDocument1.PrintPage, AddressOf Me.PrintImage
PrintDocument1.Print()
Catch ex As Exception
MsgBox(ex, MsgBoxStyle.Critical, "Error during Print")
End Try
End Sub
但是当我想打印它时,我不知道该路径如何直接指向来自 MSDN 的代码,就像这段代码 Me.PrintImage 和 Me.PrintImage(MyFile) returns 一样错误
WithEvents PrintDocument1 As New PrintDocument
Private Sub PrintImage(ByVal sender As Object, ByVal ppea As PrintPageEventArgs, MyFile As String)
ppea.Graphics.DrawImage(Image.FromFile(MyFile), ppea.Graphics.VisibleClipBounds)
ppea.HasMorePages = False
End Sub
我怎样才能将我的文件定向到此打印服务?我发现的代码基于文件的静态路径,不在文件系统观察器中,我似乎无法找到将它们联系在一起的方法。 请帮忙!
请考虑以下事项:
- 您不能更改 delegate/event 的签名,例如:
Private Sub PrintImage(ByVal sender As Object, ByVal ppea As PrintPageEventArgs, MyFile As String)
- 您始终可以声明 class 成员以在 class 中的任何位置访问它们。您可以像这样声明
MyFile
:
Public Class Form1
Private MyFile As String
End Class
现在您可以在 FileSystemWatcher1_Created
事件中为其分配值,并在 PrintImage
事件中读取该值。阅读更多:How to: Control the Scope of a Variable (Visual Basic)
- 您应该只订阅一次活动:
Public Class Form1
Private MyFile As String
Private PrintDocument1 As PrintDocument
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
PrintDocument1 = New PrintDocument
AddHandler PrintDocument1.PrintPage, AddressOf PrintImage
End Sub
Private Sub PrintImage(sender As Object, e As PrintPageEventArgs)
'...
End Sub
End Class
或者像在 FileSystemWatcher1_Created
事件中一样使用 WithEvents and Handles 子句。
Public Class Form1
Private MyFile As String
Private WithEvents PrintDocument1 As PrintDocument
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
PrintDocument1 = New PrintDocument
End Sub
Private Sub PrintImage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
'...
End Sub
End Class
或者使用设计器添加 PrintDocument
组件的实例并订阅它的事件。就像 FileSystemWatcher
组件一样。
把它们放在一起,你应该得到这样的东西:
Public Class Form1
Private MyFile As String
Private WithEvents PrintDocument1 As PrintDocument
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
PrintDocument1 = New PrintDocument
End Sub
Private Sub FileSystemWatcher1_Created(sender As Object, e As FileSystemEventArgs) Handles FileSystemWatcher1.Created
MyFile = e.FullPath
PrintDocument1.Print()
End Sub
Private Sub PrintImage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
If Not File.Exists(MyFile) Then
Return
End If
Try
Using bmp = New Bitmap(New MemoryStream(File.ReadAllBytes(MyFile)))
e.Graphics.DrawImage(bmp, e.Graphics.VisibleClipBounds)
End Using
Catch ex As ArgumentException
Console.WriteLine("Not Image!")
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Sub
Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs)
MyBase.OnFormClosed(e)
PrintDocument1.Dispose()
End Sub
End Class
恕我直言,一种更好的方法是将创建的文件收集在列表中,并将它们作为一个打印作业发送到打印机。当您在 FileSystemWatcher.Path
中粘贴多个文件时很有用。每个文件都会引发 FileSystemWatcher.Created
事件,并且还会为每个文件调用前面代码中的 PrintDocument.Print
方法。我们可以将执行相同任务的打印调用减少到一个。
下面的代码是一个快速的 Lambda-Expression-Way 示例。
Imports System.IO
Imports System.Windows.Forms
Imports System.Drawing.Printing
Imports System.Collections.Generic
Public Class Form1
Private ReadOnly watcher As FileSystemWatcher
Private ReadOnly timer As Timer 'System.Windows.Forms.Timer
Private ReadOnly printDoc As PrintDocument
Private MyFiles As Queue(Of String)
Sub New()
InitializeComponent()
MyFiles = New Queue(Of String)
watcher = New FileSystemWatcher With {
.Path = "PathToWatch",
.EnableRaisingEvents = True
}
AddHandler watcher.Created,
Sub(s, e)
If Not MyFiles.Contains(e.FullPath) Then
MyFiles.Enqueue(e.FullPath)
Invoke(Sub() timer.Start())
End If
End Sub
timer = New Timer With {.Interval = 1000}
AddHandler timer.Tick,
Sub(s, e)
timer.Stop()
printDoc.Print()
End Sub
printDoc = New PrintDocument
AddHandler printDoc.PrintPage,
Sub(s, e)
Dim imgFile = MyFiles.Dequeue
If Not File.Exists(imgFile) Then
Return
End If
Try
Using bmp = New Bitmap(New MemoryStream(File.ReadAllBytes(imgFile)))
e.Graphics.DrawImage(bmp, e.Graphics.VisibleClipBounds)
End Using
Catch ex As ArgumentException
Console.WriteLine("Not Image!")
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
e.HasMorePages = MyFiles.Count > 0
End Sub
End Sub
Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs)
MyBase.OnFormClosed(e)
watcher.Dispose()
timer.Dispose()
printDoc.Dispose()
End Sub
End Class