Zebra Android 使用 v2.8.2148 打印图像打印为字符串而不是像素

Zebra Android Printing with v2.8.2148 images print as string instead of pixels

在我们的 android 应用程序中,我们可以成功地将图像打印到 P4T 打印机。我们使用 pcx cpcl 命令打印与其他收据文本内联的图像。在打印收据之前,我们使用 zebra sdk 将图像上传到打印机内存。我们让 zebra 首先将我们的位图转换为 ZebraImage,然后上传它。在 P4T 上,这会生成一个 .PCX 文件,然后我们会在我们的 cpcl 标签中引用该文件。示例:

打印机配置:

E:signature.pcx

在 android 应用中:

static private void sendImagesToPrinter(DevicePrinter devicePrinter, List<String> imagesToSend, String rootPath) throws IOException, ConnectionException, ZebraPrinterLanguageUnknownException, ZebraIllegalArgumentException {
    for(String image:imagesToSend) {
        //[0] -> image path, <[1]> -> image scale factor
        String[] imageParams = image.split("\|");
        double scaleFactor = imageParams.length > 1 ? parseImageScale(imageParams[1]) : 1.0d;

        File file = new File(StringUtils.pathCombine(rootPath,imageParams[0]));
        if(!file.exists())
            throw new FileNotFoundException("Image file not found " + file.getName());

        ZebraImageI zebraImage = ZebraImageFactory.getImage(BitmapFactory.decodeFile(file.getAbsolutePath()));

        devicePrinter.storeImage("E:" + file.getName(), zebraImage, (int)(zebraImage.getWidth() * scaleFactor), (int)(zebraImage.getHeight() * scaleFactor));
    }
}

public void storeImage(String printerFullPath, ZebraImageI zebraImage, int width, int height) throws ConnectionException, ZebraPrinterLanguageUnknownException, IOException, ZebraIllegalArgumentException {
    Connection connection = null;
    try {
        connection = ConnectionBuilder.build(connectionString);
        connection.open();
        ZebraPrinter printer = ZebraPrinterFactory.getInstance(connection);

        printer.storeImage(printerFullPath, zebraImage, width, height);

    }
    finally {
        if(connection != null)
            connection.close();
    }
}

cpcl格式文件:

PCX 10 280 !<signature.pcx

我们设置了一个缩放参数来管理打印机存储的图像大小。这可以在 P4T 打印机上打印出很好的图像,但我们有一个 QLn420 可以打印图像的长字符串表示。

收据的其他文本部分可以在这些设备上正常打印。

有人遇到过这个问题并且知道如何解决吗?

*编辑 我还尝试使用以下代码直接将斑马图像打印到打印机。无论哪个,我总是得到字符串(图像的 base64 表示形式。)

public void printImage(ZebraImageI zebraImage, int width, int height) throws ConnectionException, ZebraPrinterLanguageUnknownException, ZebraIllegalArgumentException {
    Connection connection = null;
    try {
        connection = ConnectionBuilder.build(connectionString);
        connection.open();
        ZebraPrinter printer = ZebraPrinterFactory.getInstance(connection);
        printer.printImage(zebraImage, 0, 0, width, height, false);
    }
    finally {
        if(connection != null)
            connection.close();
    }
}

**编辑 在 Qln420 上,图像从不存储。我期待它在调用 storeImage() 后显示在 "E:sigfile.pcx" 但它永远不会保存。还不知道为什么。

我们的解决方法是在创建用于存储图像的新打印机时明确设置打印机语言:

public void storeImage(String printerFullPath, ZebraImageI zebraImage, int width, int height, PrinterLanguage printerLanguage) throws ConnectionException, ZebraPrinterLanguageUnknownException, IOException, ZebraIllegalArgumentException {
    Connection connection = null;
    try {
        connection = ConnectionBuilder.build(connectionString);
        connection.open();

        ZebraPrinter printer = ZebraPrinterFactory.getInstance(printerLanguage, connection);

        printer.storeImage(printerFullPath, zebraImage, width, height);

    }
    finally {
        if(connection != null)
            connection.close();
    }
}

此外,我们发现删除图片的文件扩展名对一台设备很有帮助,因此我们现在删除所有情况下的文件扩展名。 所以对我们来说,打印带有内联图像的 CPCL 格式收据适用于 P4T、QLn420 和 ZQ520。

此外,我们发现在存储图像之前缩放图像也是必要的,因为大型图像存储将失败而不会引发异常。

    ZebraImageI zebraImage = ZebraImageFactory.getImage(BitmapFactory.decodeFile(file.getAbsolutePath()));
    double scaleFactor = (printedImageWidth == null) ? 1.0 : (double)printedImageWidth / zebraImage.getWidth();
    //strip off the extension
    String fileName = file.getName().split("\.")[0];
    devicePrinter.storeImage(fileName, zebraImage, (int)(zebraImage.getWidth() * scaleFactor), (int)(zebraImage.getHeight() * scaleFactor), printerLanguage);