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

如何通过Android PrintService配置PAX A920内置POS打印机并实现PrintDocument转Bitmap打印

解决PAX A920 Android PrintService配置与PrintDocument转Bitmap问题

一、配置内置POS打印机的Android PrintService

你已经完成了打印机注册的基础代码,但需要针对PAX A920的热敏小票打印机特性调整配置,确保系统能正确识别并适配:

  • 修正打印机介质尺寸:热敏小票不是A6,应该使用Android提供的POS专用介质尺寸,比如80mm宽的小票,对应PrintAttributes.MediaSize.NA_PAYMENT_SLIP(低版本API兼容)或PrintAttributes.MediaSize.MEDIA_SIZE_POS_80MM(API 26+专用)。替换你代码中的介质尺寸配置:

    capBuilder.addMediaSize(PrintAttributes.MediaSize.NA_PAYMENT_SLIP, true); // 设置为默认打印尺寸
    
  • 调整色彩模式:PAX内置热敏打印机是单色输出,不支持彩色,所以要把色彩模式改成仅支持单色:

    capBuilder.setColorModes(PrintAttributes.COLOR_MODE_MONOCHROME, PrintAttributes.COLOR_MODE_MONOCHROME);
    
  • 匹配打印机真实分辨率:PAX A920的内置打印机通常是203dpi,不是600dpi,修正分辨率配置:

    capBuilder.addResolution(new PrintAttributes.Resolution("resolutionId", "203dpi", 203, 203), true);
    
  • 动态维护打印机状态:除了初始注册,还要在PrintService中监听PAX打印机的真实状态(比如缺纸、离线),调用updatePrinterState更新状态,让系统打印预览能正确反馈打印机情况:

    // 示例:检测到打印机缺纸时更新状态
    PrinterInfo updatedInfo = printerInfo.buildUpon()
            .setStatus(PrinterInfo.STATUS_UNAVAILABLE)
            .setStatusReason("打印机缺纸")
            .build();
    updatePrinterState(updatedInfo);
    

二、将PrintDocument转换为Bitmap格式

Chrome打印生成的PrintDocument是PDF格式,你需要把PDF渲染成Bitmap,再传给PAX的PrintPayload。这里用Android原生的PdfRenderer实现:

步骤1:获取PrintDocument的PDF输入流并保存为临时文件

PdfRenderer需要文件描述符,所以先把输入流转成临时文件:

PrintDocument document = printJob.getDocument();
InputStream inputStream = document.getData();
File tempPdf = new File(getCacheDir(), "temp_print.pdf");

try (FileOutputStream fos = new FileOutputStream(tempPdf)) {
    byte[] buffer = new byte[1024];
    int length;
    while ((length = inputStream.read(buffer)) != -1) {
        fos.write(buffer, 0, length);
    }
} catch (IOException e) {
    e.printStackTrace();
    return;
}

步骤2:用PdfRenderer渲染PDF为Bitmap

Bitmap bitmap = null;
try (ParcelFileDescriptor fd = ParcelFileDescriptor.open(tempPdf, ParcelFileDescriptor.MODE_READ_ONLY);
     PdfRenderer renderer = new PdfRenderer(fd)) {
    if (renderer.getPageCount() > 0) {
        PdfRenderer.Page page = renderer.openPage(0); // 小票通常是单页,多页可循环处理
        // 计算适配PAX打印机的Bitmap尺寸(80mm宽≈640px,基于203dpi)
        int targetWidth = (int) (80 * 203 / 25.4); // 80mm转px,25.4是英寸转毫米系数
        float scale = (float) targetWidth / page.getWidth();
        int targetHeight = (int) (page.getHeight() * scale);
        
        bitmap = Bitmap.createBitmap(targetWidth, targetHeight, Bitmap.Config.ARGB_8888);
        page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_PRINT);
        page.close();
    }
} catch (IOException e) {
    e.printStackTrace();
}

步骤3:将Bitmap传给PAX打印接口

拿到Bitmap后直接复用你现有的PAX打印代码即可:

if (bitmap != null) {
    PrintPayload payload = new PrintPayload();
    payload.append(bitmap).align(Alignment.CENTER);
    print(payload);
    // 回收Bitmap避免内存泄漏
    bitmap.recycle();
}
// 用完删除临时文件
tempPdf.deleteOnExit();

额外提示

如果是多页PDF,需要循环渲染每一页,然后把多个Bitmap拼接成一个长图再打印,避免分页输出。

内容的提问来源于stack exchange,提问作者Shoaib Anwar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:27:44