如何通过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
相关产品推荐
相关产品推荐

