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

问题描述 投票:0回答:1

我昨天安装了ZPL打印机模拟器Chrome插件,并且可以从NotePad向它发送作业。下面的VBA代码似乎正在将数据发送到仿真器,同时给出了在窗口底部短暂弹出的消息,提示已接收到数据。但是,从消息中可以明显看出端口号是动态的。第一次通过时,消息显示为“从客户端127.0.0.1端口52616接收到686字节”。其他运行将端口列出为52635、52649,以此类推(它们的确在增加)。当此仿真器正在监听端口9100时,没有任何作业在屏幕上打印...空白。

如何修改下面的代码以为所有作业设置端口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函数确定端口时,该函数返回空字符串...

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不会引起任何错误,但是模拟器不会显示带有以下代码的“接收到的字节”消息,表明未建立与打印机的连接:

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代码发送到打印机的方式。换句话说,我想坚持使用“打开#1 /打印#1 /关闭#1”技术将命令发送到打印机。基本上,我只希望能够轻松地在模拟器和真实打印机之间切换。

使用MyPrinter = "\\127.0.0.1\ZebraSim:9100"也将导致“收到字节”消息,但同样不会打印出任何内容。

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。

[还要注意,我简化了打印“示例1”的行,认为字符映射和字体规范可能会影响事物。原始代码(带有字体规范)在NotePad上运行良好,但我认为我应该将其排除在外。

excel vba zebra-printers zpl-ii
1个回答
0
投票

我将ZPLII代码移回记事本,以验证我仍然可以从该应用程序进行打印...我无法。这是因为XA和XZ命令始终缺失。在此过程中的某个地方,我对整个端口问题感到分心,却忘记在代码中包含这些关键行。

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

[此外,如果我发现如果[:C0]行中没有“:9100”,则不会生成PDF文件。我仍然可以在“ ZPL打印机”窗口中获得模拟打印输出,但是没有生成文件。感谢Delphi Coder的建议,如果我需要这些PDF,那将是一件好事。

MyPrinter = "\\127.0.0.1\ZebraSim:9100"
© www.soinside.com 2019 - 2024. All rights reserved.