You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 02:15:03