【发布时间】:2021-09-17 11:35:56
【问题描述】:
我在使用 VB.NET 自动选择要在特定打印机(HP OfficeJet Pro 9020 系列)上打印的纸盘(PaperSource)时遇到了问题。我已将我的代码减少到最低限度,以表明我正在遵循的过程。
在弹出打印对话框并从列表中选择“纸盘 2”后。代码行prn.PrinterSettings = pd.PrinterSettings 应用该设置,然后从正确的纸盘打印。但是,如果您只是在从错误托盘打印的对话框上单击确定。
奇怪的是,如您所见,我在代码中设置了“Tray 2”选项,所以理论上该对象应该完全相同。我使用Newtonsoft.JSON 序列化pd.PrinterSettings 对象之前和之后我在对话框中选择了“托盘2”,这样我就可以比较差异并且它们都是相同的。最初的唯一区别是我之前在代码中提到的那些。他们没有任何区别。那些存在;
pd.PrinterSettings.PrintFileName = "IP_192.168.1.50"
pd.PrinterSettings.PrinterName = "Dispatch Office"
pd.PrinterSettings.Collate = False
但无论出于何种原因,它只有在我明确打开对话框并选择所需的托盘并单击确定时才有效。 prn.PrinterSettings = pd.PrinterSettings 是唯一对所使用的打印机有任何影响的代码行,所以在 pd.PrinterSettings 的某个地方一定有一些我在 JSON 字符串中看不到的东西丢失了。我在其他打印机上使用此代码取得了成功,但这个特定的打印机似乎有所不同,但我认为问题必须出在 VB.NET 上。
以前有没有人遇到过这样的事情?下面是我的完整代码。
Private Sub Print()
Dim pd As New PrintDialog
pd.PrinterSettings.PrintFileName = "IP_192.168.1.50"
pd.PrinterSettings.PrinterName = "Dispatch Office"
pd.PrinterSettings.Collate = False
For Each paperSource As Printing.PaperSource In pd.PrinterSettings.PaperSources
If paperSource.SourceName = "Tray 2" Then
pd.PrinterSettings.DefaultPageSettings.PaperSource = paperSource
Exit For
End If
Next
If pd.ShowDialog = DialogResult.OK Then
Dim prn As New Printing.PrintDocument
prn.PrinterSettings = pd.PrinterSettings
AddHandler prn.PrintPage, AddressOf Me.PrintPageHandler
prn.Print()
RemoveHandler prn.PrintPage, AddressOf Me.PrintPageHandler
End If
End Sub
Private Sub PrintPageHandler(ByVal sender As Object, ByVal args As Printing.PrintPageEventArgs)
Dim myFont As New Font("Courier New", 9)
Dim strTextFile = IO.File.ReadAllText("C:\textfile.txt")
args.Graphics.DrawString(strTextFile, New Font(myFont, FontStyle.Regular), Brushes.Black, 50, 50)
End Sub
另外,确认一下,这与打印对话框无关。 下面的尽可能短的代码也不起作用。
Private Sub PrintAuto()
Dim ps As New Printing.PrinterSettings With {.PrinterName = "Dispatch Office"}
ps.DefaultPageSettings.PaperSource = ps.PaperSources(3) ' Tray 2
Dim prn As New Printing.PrintDocument With {.PrinterSettings = ps}
AddHandler prn.PrintPage, AddressOf PrintPageHandler
prn.Print()
RemoveHandler prn.PrintPage, AddressOf PrintPageHandler
End Sub
【问题讨论】:
-
您正在更改
DefaultPageSettings,这是打印机对话框向用户显示内容的基线,而不是最终结果。 -
@GSerg 这看起来确实很奇怪,但这是唯一的选择。没有
PageSettings选项。此外,请参阅 Microsoft 文档,其中建议以这种方式完成。 docs.microsoft.com/en-us/dotnet/api/… -
@GSerg 为了清楚起见,我在原始帖子的末尾添加了另一个代码块。感谢您的帮助。
-
您提到使用 json 序列化比较对象;您是否尝试过在代码中放置断点并检查监视窗口中的对象?监视窗口可以查看实际类型(不仅仅是静态类型)和私有成员,因此您可能可以在那里找到未序列化的内容。
-
没有
PaperSourceKind类型的Tray 2。如果需要为 PrintDocument 提供自定义PaperSource和PaperSize,则需要构建自定义对象并指定Kind和RawKind属性。否则,请使用标准枚举选择现有的论文来源之一(您无法编造名称,请使用 PaperSourceKind 枚举器)。