Zebra 打印机无法打印 ZPL 格式
Zebra printer won't print ZPL format
我正在关注 Zebra Android Link_OS SDK 示例代码,用于通过蓝牙在 ZQ510 上打印测试标签,但它不会以 ZPL 格式打印。
这是我运行打印标签的代码:
private void sendZplOverBluetooth(final String theBtMacAddress) {
new Thread(new Runnable() {
public void run() {
try {
// Instantiate connection for given Bluetooth® MAC Address.
Connection thePrinterConn = new BluetoothConnection(theBtMacAddress);
// Initialize
Looper.prepare();
// Open the connection - physical connection is established here.
thePrinterConn.open();
// This example prints "This is a ZPL test." near the top of the label.
String zplData = "^XA^FO20,20^A0N,25,25^FDThis is a ZPL test.^FS^XZ";
// Send the data to printer as a byte array.
thePrinterConn.write(zplData.getBytes());
// Make sure the data got to the printer before closing the connection
Thread.sleep(500);
// Close the connection to release resources.
thePrinterConn.close();
Looper.myLooper().quit();
} catch (Exception e) {
// Handle communications error here.
e.printStackTrace();
}
}
}).start();
}
这是打印的结果。 (我运行它两次,这就是为什么有两个测试打印)。
然后我读到了它在不同模式下的情况,因为出于某种原因 Zebra 无法检测到他们自己的专有语言。所以我尝试获取设置并查看 Android 应用程序。再次使用给定的 Link-OS SDK 示例代码:
private static void displaySettings(Connection c) throws ConnectionException, ZebraPrinterLanguageUnknownException, SettingsException, ZebraIllegalArgumentException {
ZebraPrinter genericPrinter = ZebraPrinterFactory.getInstance(c);
ZebraPrinterLinkOs linkOsPrinter = ZebraPrinterFactory.createLinkOsPrinter(genericPrinter);
if (linkOsPrinter != null) {
System.out.println("Available Settings for myDevice");
Set<String> availableSettings = linkOsPrinter.getAvailableSettings();
for (String setting : availableSettings) {
System.out.println(setting + ": Range = (" + linkOsPrinter.getSettingRange(setting) + ")");
}
System.out.println("\nCurrent Setting Values for myDevice");
Map<String, String> allSettingValues = linkOsPrinter.getAllSettingValues();
for (String settingName : allSettingValues.keySet()) {
System.out.println(settingName + ":" + allSettingValues.get(settingName));
}
String darknessSettingId = "print.tone";
String newDarknessValue = "10.0";
if (availableSettings.contains(darknessSettingId) &&
linkOsPrinter.isSettingValid(darknessSettingId, newDarknessValue) &&
linkOsPrinter.isSettingReadOnly(darknessSettingId) == false) {
linkOsPrinter.setSetting(darknessSettingId, newDarknessValue);
}
System.out.println("\nNew " + darknessSettingId + " Value = " + linkOsPrinter.getSettingValue(darknessSettingId));
}
}
这一次,我得到一个 SettingsException
的描述 Operation cannot be performed on raw channel with a printer set to line print mode
如何使用 Mac 打印 ZPL 文本并正确开发 Android?我阅读了有关使用一些 Zebra Utility 应用程序来更改模式的信息,但它仅适用于 Windows,并且他们的 Android 应用程序不起作用。
无论如何,如果有人在不正确的模式下使用带有打印机的应用程序,他们将不得不经历所有这些不必要的设置,这对任何人来说都不直观。
感谢您的帮助并感谢任何反馈。
如果您不想像 Dayan 答案那样以编程方式执行此步骤,并且您可以访问 Windows 机器(或模拟机器),请安装Zebra 设置实用程序。然后按照这里的说明 https://km.zebra.com/kb/index?page=content&id=SO7296 使用命令
将打印模式切换到 ZPL
! U1 setvar "device.languages" "zpl"
您可以通过编程方式将打印模式设置为 ZPL,目前处于 line-mode
。
这样做:
BluetoothConnection printerIns= new BluetoothConnection(theBtMacAddress);
ZebraPrinter zPrinterIns = ZebraPrinterFactory.getInstance(printerIns);
//Set printer to ZPL mode
zPrinterIns.sendCommand("! U1 setvar \"device.languages\" \"zpl\"\r\n");
//Feed and calibrate to the media
zPrinterIns.sendCommand("~jc^xa^jus^xz");
在您的示例代码中,您正在建立蓝牙连接并尝试发送原始数据,使用 Zebra 提供的 ZebraPrinter
和 BluetoothConnection
类 而不是 com.zebra.sdk.printer
命名空间。
我更正了您的代码,现在应该可以使用了。
new Thread(new Runnable() {
public void run() {
try {
// Instantiate connection for given Bluetooth® MAC Address.
BluetoothConnection thePrinterConn = new BluetoothConnection(theBtMacAddress);
// Initialize
Looper.prepare();
// Open the connection - physical connection is established here.
ZebraPrinter zPrinterIns = ZebraPrinterFactory.getInstance(thePrinterConn);
zPrinterIns.sendCommand("! U1 setvar \"device.languages\" \"zpl\"\r\n");
zPrinterIns.sendCommand("~jc^xa^jus^xz");
Thread.sleep(500);
// Send the data to printer as a byte array.
zPrinterIns.sendCommand("^XA^FO20,20^A0N,25,25^FDThis is a ZPL test.^FS^XZ");
// Make sure the data got to the printer before closing the connection
Thread.sleep(500);
// Close the connection to release resources.
thePrinterConn.close();
Looper.myLooper().quit();
} catch (Exception e) {
// Handle communications error here.
e.printStackTrace();
}
}
}).start();
我正在关注 Zebra Android Link_OS SDK 示例代码,用于通过蓝牙在 ZQ510 上打印测试标签,但它不会以 ZPL 格式打印。
这是我运行打印标签的代码:
private void sendZplOverBluetooth(final String theBtMacAddress) {
new Thread(new Runnable() {
public void run() {
try {
// Instantiate connection for given Bluetooth® MAC Address.
Connection thePrinterConn = new BluetoothConnection(theBtMacAddress);
// Initialize
Looper.prepare();
// Open the connection - physical connection is established here.
thePrinterConn.open();
// This example prints "This is a ZPL test." near the top of the label.
String zplData = "^XA^FO20,20^A0N,25,25^FDThis is a ZPL test.^FS^XZ";
// Send the data to printer as a byte array.
thePrinterConn.write(zplData.getBytes());
// Make sure the data got to the printer before closing the connection
Thread.sleep(500);
// Close the connection to release resources.
thePrinterConn.close();
Looper.myLooper().quit();
} catch (Exception e) {
// Handle communications error here.
e.printStackTrace();
}
}
}).start();
}
这是打印的结果。 (我运行它两次,这就是为什么有两个测试打印)。
private static void displaySettings(Connection c) throws ConnectionException, ZebraPrinterLanguageUnknownException, SettingsException, ZebraIllegalArgumentException {
ZebraPrinter genericPrinter = ZebraPrinterFactory.getInstance(c);
ZebraPrinterLinkOs linkOsPrinter = ZebraPrinterFactory.createLinkOsPrinter(genericPrinter);
if (linkOsPrinter != null) {
System.out.println("Available Settings for myDevice");
Set<String> availableSettings = linkOsPrinter.getAvailableSettings();
for (String setting : availableSettings) {
System.out.println(setting + ": Range = (" + linkOsPrinter.getSettingRange(setting) + ")");
}
System.out.println("\nCurrent Setting Values for myDevice");
Map<String, String> allSettingValues = linkOsPrinter.getAllSettingValues();
for (String settingName : allSettingValues.keySet()) {
System.out.println(settingName + ":" + allSettingValues.get(settingName));
}
String darknessSettingId = "print.tone";
String newDarknessValue = "10.0";
if (availableSettings.contains(darknessSettingId) &&
linkOsPrinter.isSettingValid(darknessSettingId, newDarknessValue) &&
linkOsPrinter.isSettingReadOnly(darknessSettingId) == false) {
linkOsPrinter.setSetting(darknessSettingId, newDarknessValue);
}
System.out.println("\nNew " + darknessSettingId + " Value = " + linkOsPrinter.getSettingValue(darknessSettingId));
}
}
这一次,我得到一个 SettingsException
的描述 Operation cannot be performed on raw channel with a printer set to line print mode
如何使用 Mac 打印 ZPL 文本并正确开发 Android?我阅读了有关使用一些 Zebra Utility 应用程序来更改模式的信息,但它仅适用于 Windows,并且他们的 Android 应用程序不起作用。
无论如何,如果有人在不正确的模式下使用带有打印机的应用程序,他们将不得不经历所有这些不必要的设置,这对任何人来说都不直观。
感谢您的帮助并感谢任何反馈。
如果您不想像 Dayan 答案那样以编程方式执行此步骤,并且您可以访问 Windows 机器(或模拟机器),请安装Zebra 设置实用程序。然后按照这里的说明 https://km.zebra.com/kb/index?page=content&id=SO7296 使用命令
将打印模式切换到 ZPL! U1 setvar "device.languages" "zpl"
您可以通过编程方式将打印模式设置为 ZPL,目前处于 line-mode
。
这样做:
BluetoothConnection printerIns= new BluetoothConnection(theBtMacAddress);
ZebraPrinter zPrinterIns = ZebraPrinterFactory.getInstance(printerIns);
//Set printer to ZPL mode
zPrinterIns.sendCommand("! U1 setvar \"device.languages\" \"zpl\"\r\n");
//Feed and calibrate to the media
zPrinterIns.sendCommand("~jc^xa^jus^xz");
在您的示例代码中,您正在建立蓝牙连接并尝试发送原始数据,使用 Zebra 提供的 ZebraPrinter
和 BluetoothConnection
类 而不是 com.zebra.sdk.printer
命名空间。
我更正了您的代码,现在应该可以使用了。
new Thread(new Runnable() {
public void run() {
try {
// Instantiate connection for given Bluetooth® MAC Address.
BluetoothConnection thePrinterConn = new BluetoothConnection(theBtMacAddress);
// Initialize
Looper.prepare();
// Open the connection - physical connection is established here.
ZebraPrinter zPrinterIns = ZebraPrinterFactory.getInstance(thePrinterConn);
zPrinterIns.sendCommand("! U1 setvar \"device.languages\" \"zpl\"\r\n");
zPrinterIns.sendCommand("~jc^xa^jus^xz");
Thread.sleep(500);
// Send the data to printer as a byte array.
zPrinterIns.sendCommand("^XA^FO20,20^A0N,25,25^FDThis is a ZPL test.^FS^XZ");
// Make sure the data got to the printer before closing the connection
Thread.sleep(500);
// Close the connection to release resources.
thePrinterConn.close();
Looper.myLooper().quit();
} catch (Exception e) {
// Handle communications error here.
e.printStackTrace();
}
}
}).start();