VB.NET使用PrinterSettings指定HP 9020打印机PaperSource进纸托盘无效求助
问题触发原因
这个问题是HP OfficeJet Pro系列打印机驱动的特有兼容问题,和VB.NET的打印API交互逻辑有关:
- .NET的
PrinterSettings.DefaultPageSettings.PaperSource配置不会主动同步到PrintDocument的页面设置中,HP驱动会优先读取打印作业关联的文档页面设置值,而非全局打印机设置 - 你代码中提前设置了
PrintFileName但未启用PrintToFile参数,该冗余配置会干扰HP驱动的托盘识别逻辑 - Newtonsoft.Json序列化仅能读取对象的公共属性,HP驱动存储在PrinterSettings非公共字段中的托盘校验标识不会被序列化,所以你对比不到差异
- 手动在打印对话框选择托盘时,系统会自动完成驱动所需的所有配置字段赋值,而代码单独设置PaperSource只会修改公共属性,缺少驱动要求的私有字段更新
解决方案
修正后的无对话框版本代码
Private Sub PrintAuto() ' 先初始化PrintDocument而非单独创建PrinterSettings,保证配置同步 Dim prn As New Printing.PrintDocument() prn.PrinterSettings.PrinterName = "Dispatch Office" ' 清除干扰驱动识别的冗余PrintFileName配置 prn.PrinterSettings.PrintFileName = String.Empty prn.PrinterSettings.Collate = False ' 匹配托盘时去除名称前后空格,避免隐性字符导致匹配失效 Dim targetTray As Printing.PaperSource = Nothing For Each ps As Printing.PaperSource In prn.PrinterSettings.PaperSources If ps.SourceName.Trim() = "Tray 2" Then targetTray = ps Exit For End If Next If targetTray IsNot Nothing Then ' 同时给PrinterSettings和PrintDocument的页面设置赋值,适配HP驱动逻辑 prn.PrinterSettings.DefaultPageSettings.PaperSource = targetTray prn.DefaultPageSettings.PaperSource = targetTray ' 替换默认打印控制器,跳过系统预览层的配置覆盖 prn.PrintController = New Printing.StandardPrintController() End If AddHandler prn.PrintPage, AddressOf PrintPageHandler prn.Print() RemoveHandler prn.PrintPage, AddressOf PrintPageHandler End Sub
带对话框版本的修正点
仅需要在原有逻辑中新增配置同步的代码即可:
If pd.ShowDialog = DialogResult.OK Then Dim prn As New Printing.PrintDocument prn.PrinterSettings = pd.PrinterSettings ' 新增:手动同步页面设置的PaperSource参数 prn.DefaultPageSettings.PaperSource = pd.PrinterSettings.DefaultPageSettings.PaperSource prn.PrintController = New Printing.StandardPrintController() AddHandler prn.PrintPage, AddressOf Me.PrintPageHandler prn.Print() RemoveHandler prn.PrintPage, AddressOf Me.PrintPageHandler End If
兜底适配方案
如果以上修改仍不生效,可以替换HP官方通用打印驱动(UPD)替代原厂专用驱动,通用驱动对.NET打印API的兼容性更好,不会出现私有字段校验的问题。
内容的提问来源于stack exchange,提问作者Henry Boler
相关产品推荐
相关产品推荐

