从 Excel VBA 打印到 "ZPL Printer" Zebra 标签打印机 Chrome 插件模拟器时,如何将端口永久设置为 9100

How do I permanently set the port to 9100 when printing from Excel VBA to the "ZPL Printer" Zebra label printer Chrome plug-in emulator

我昨天安装了 ZPL 打印机模拟器 Chrome 插件,我可以从记事本向它发送作业。下面的 VBA 代码似乎也在向模拟器发送数据,同时 window 底部会弹出一条消息,表示已收到数据。但是,从消息中可以清楚地看出端口号是动态的。第一次通过时,消息显示“从客户端 127.0.0.1 端口 52616 接收到 686 个字节”。其他运行将端口列为 52635、52649 等等(它们确实在增加)。由于此模拟器正在侦听端口 9100,none 的作业正在屏幕上打印...它是空白的。

如何修改下面的代码来为所有作业设置端口 9100?

Sub FourByTwo()
    Dim MyPrinter, NumLabels As Integer
    MyPrinter = "\127.0.0.1\ZebraSim"
    NumLabels = 1
    Open MyPrinter For Output As #1
    Print #1, "^PQ" & NumLabels
    Print #1, "^LT0"
    Print #1, "^MD3"
    Print #1, "^POI"
    Print #1, "^CI34^FO0,730^A0,20,18,E:ARIALNB.FNT^FH^FDSample 1^FS"
    Print #1, "^CI34^FO0,670^A0,20,18,E:ARIALNB.FNT^FH^FDSample 2^FS"
    Print #1, "^CI34^FO0,610^A0,20,18,E:ARIALNB.FNT^FH^FDSample 3^FS"
    Print #1, "^CI34^FO0,550^A0,20,18,E:ARIALNB.FNT^FH^FDSample 4^FS"
    Print #1, "^CI34^FO0,490^A0,20,18,E:ARIALNB.FNT^FH^FDSample 5^FS"
    Print #1, "^CI34^FO0,430^A0,20,18,E:ARIALNB.FNT^FH^FDSample 6^FS"
    Print #1, "^CI34^FO0,370^A0,20,18,E:ARIALNB.FNT^FH^FDSample 7^FS"
    Print #1, "^CI34^FO0,310^A0,20,18,E:ARIALNB.FNT^FH^FDSample 8^FS"
    Print #1, "^CI34^FO0,250^A0,20,18,E:ARIALNB.FNT^FH^FDSample 9^FS"
    Print #1, "^CI34^FO0,190^A0,20,18,E:ARIALNB.FNT^FH^FDSample 10^FS"
    Print #1, "^CI34^FO0,130^A0,20,18,E:ARIALNB.FNT^FH^FDSample 11^FS"
    Print #1, "^CI34^FO0,70^A0,20,18,E:ARIALNB.FNT^FH^FDSample 12^FS"
    Close #1
End Sub

请注意,当我尝试使用 GetPrinterPort2 函数确定端口时,函数 returns 一个空字符串...

Public Function GetPrinterPort2(strPrinterName As String) As String
    Dim objReg As Object, strRegVal As String, strValue As String
    Const HKEY_CURRENT_USER = &H80000001
    Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\.\root\default:StdRegProv")
    strRegVal = "Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts\"
    objReg.GetStringValue HKEY_CURRENT_USER, strRegVal, strPrinterName, strValue
    GetPrinterPort2 = Mid$(strValue, 10, 5)
End Function
Sub FourByTwo()
    Dim MyPrinter As String, NumLabels As Integer, ZebraSimPort
    MyPrinter = "\127.0.0.1\ZebraSim"
    ZebraSimPort = GetPrinterPort2(MyPrinter)
    '...
End Sub

使用 GetPrinterPort2 函数将 ActivePrinter 设置为 ZebraSim on 9100 不会导致任何错误,但模拟器不会显示带有以下代码的 "bytes received" 消息,提示与打印机的连接是未建立:

Public Function GetPrinterPort2(strPrinterName As String) As String
    Dim objReg As Object, strRegVal As String, strValue As String
    Const HKEY_CURRENT_USER = &H80000001
    Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\.\root\default:StdRegProv")
    strRegVal = "Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts\"
    objReg.GetStringValue HKEY_CURRENT_USER, strRegVal, strPrinterName, strValue
    GetPrinterPort2 = Replace(Mid$(strValue, 10, 5), ",", "")
End Function
Sub FourByTwo()
    Dim strPrinter As String, actPrinter As String, numLabels As Integer
    numLabels = 1
    With Application
        actPrinter = .ActivePrinter
        strPrinter = "ZebraSim"
        .ActivePrinter = strPrinter & " on " & GetPrinterPort2(strPrinter)
        Open .ActivePrinter For Output As #1
        Print #1, "^PQ" & numLabels
        Print #1, "^LT0"
        Print #1, "^MD3"
        Print #1, "^POI"
        Print #1, "^CI34^FO0,730^A0,20,18,E:ARIALNB.FNT^FH^FDSample 1^FS"
        Close #1
        .ActivePrinter = actPrinter
    End With
End Sub

请注意,由于我最终会返回到真正的 Zebra 打印机进行打印,因此我不想为了让这个模拟器工作而修改 ZPLII 代码发送到打印机的方式。换句话说,我想坚持使用 Open #1/Print #1/Close #1 技术向打印机发送命令。基本上,我只是希望能够在模拟器和真实打印机之间轻松切换。

使用 MyPrinter = "\127.0.0.1\ZebraSim:9100" 也会产生 "bytes received" 消息,但同样不会打印任何内容。

Sub FourByTwo()
    Dim MyPrinter As String, NumLabels As Integer
    MyPrinter = "\127.0.0.1\ZebraSim:9100"
    NumLabels = 1
    Open MyPrinter For Output As #1
    Print #1, "^PQ" & NumLabels
    Print #1, "^LT0"
    Print #1, "^MD3"
    Print #1, "^POI"
    Print #1, "^FO100,100^A0,25,25^FDSample 1^FS"
    Close #1
End Sub

我在测试时还发现,当在 ZPL 打印机界面的“设置”对话框中选中 Save labels 复选框时,不会在目标文件夹中生成 PDF 文件。从 NotePad 打印时,此功能运行良好(制作的文件包含正确生成的标签)。由于程序报告已收到字节,我本以为目标文件夹中会出现一个空的 PDF。

另请注意,我简化了打印 "Sample 1" 的行,认为字符映射和字体规范可能会影响某些事情。原始代码(带有字体规范)在记事本上运行良好,但我想我会继续排除它。


我将 ZPLII 代码移回记事本以验证我是否仍然可以从该应用程序打印...我做不到。这是因为一直缺少 XA 和 XZ 命令。在这个过程中的某个时候,我被整个端口问题分散了注意力,忘记了在代码中包含这些关键行。

所以现在下面的代码打印到下一个可用端口,这并不是我真正想要做的(我想强制它每次都打印到 9100),但它可以满足我的需要.

此外,如果我注意到 MyPrinter = "\127.0.0.1\ZebraSim:9100" 行中不存在“:9100”,则不会生成 PDF 文件。我仍然在 ZPL 打印机 window 中得到模拟打印输出,但没有生成文件。感谢 Delphi Coder 的建议,如果我需要的话,手头有这些 PDF 是件好事。

Sub FourByTwo()
    Dim MyPrinter As String, NumLabels As Integer
    MyPrinter = "\127.0.0.1\ZebraSim:9100"
    NumLabels = 1
    Open MyPrinter For Output As #1
    Print #1, "^XA"
    Print #1, "^PQ" & NumLabels
    Print #1, "^LT0"
    Print #1, "^MD3"
    Print #1, "^POI"
    Print #1, "^FO100,100^A0,25,25^FDSample 1^FS"
    Print #1, "^XZ"
    Close #1
End Sub