Android平台热敏打印机打印PDF收据时Logo及图形无法显示问题求助
解决热敏打印机打印PDF缺失Logo及图形的问题
我之前也碰到过类似的热敏打印机打印PDF丢失图形的情况,结合你的代码和场景,咱们一步步排查解决:
问题分析
先看你的代码里几个可能的坑:
- 在
onLayout方法中,你把文档类型设置成了CONTENT_TYPE_PHOTO,这个类型是给纯图片打印用的,系统会用照片渲染逻辑处理,可能会过滤掉PDF里的矢量图形或者压缩过度,导致热敏打印机无法识别。 onWrite方法没有完整处理流关闭和回调通知,可能导致PDF内容未完全写入打印服务,部分图形数据丢失。- 另外要先确认你生成的PDF本身是正常的——本地打开能看到Logo和所有图形,排除PDF生成阶段的问题。
解决方案
1. 修正文档类型
把PrintDocumentInfo的内容类型从CONTENT_TYPE_PHOTO改成CONTENT_TYPE_DOCUMENT,让系统用文档渲染逻辑处理,保留所有文本和图形元素:
@Override public void onLayout(PrintAttributes printAttributes, PrintAttributes printAttributes1, CancellationSignal cancellationSignal, LayoutResultCallback layoutResultCallback, Bundle bundle) { if (cancellationSignal.isCanceled()) { layoutResultCallback.onLayoutCancelled(); } else { PrintDocumentInfo.Builder builder = new PrintDocumentInfo.Builder("receipt.pdf"); builder.setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) // 切换为文档类型 .setPageCount(PrintDocumentInfo.PAGE_COUNT_UNKNOWN) .build(); layoutResultCallback.onLayoutFinished(builder.build(), !printAttributes1.equals(printAttributes)); } }
2. 完善onWrite方法的流处理和回调
确保流被正确关闭,并且在打印完成/出错时通知回调,避免内容截断:
@Override public void onWrite(PageRange[] pageRanges, ParcelFileDescriptor parcelFileDescriptor, CancellationSignal cancellationSignal, WriteResultCallback writeResultCallback) { InputStream in = null; OutputStream out = null; try { File file = new File(pathName); in = new FileInputStream(file); out = new FileOutputStream(parcelFileDescriptor.getFileDescriptor()); byte[] buf = new byte[16384]; int size; while ((size = in.read(buf)) >= 0 && !cancellationSignal.isCanceled()) { out.write(buf, 0, size); } // 通知打印完成状态 if (!cancellationSignal.isCanceled()) { writeResultCallback.onWriteFinished(pageRanges); } else { writeResultCallback.onWriteCancelled(); } } catch (IOException e) { // 通知打印失败 writeResultCallback.onWriteFailed(e.getMessage()); e.printStackTrace(); } finally { // 确保流资源被释放 try { if (in != null) in.close(); if (out != null) out.close(); } catch (IOException e) { e.printStackTrace(); } } }
3. 额外检查项
- PDF生成验证:用PDF阅读器打开你生成的文件,确认Logo和图形都存在,没有生成时的丢失。
- 打印机属性适配:如果还是有问题,可以在
PrintAttributes里指定热敏打印机的分辨率(比如常见的203dpi),避免图形被缩放变形或丢失:PrintAttributes attributes = new PrintAttributes.Builder() .setMediaSize(PrintAttributes.MediaSize.ISO_A5) .setResolution(new PrintAttributes.Resolution("THERMAL_RES", "203dpi", 203, 203)) .build();
按照上面的步骤调整后,应该就能解决图形缺失的问题了。
内容的提问来源于stack exchange,提问作者Anand Vaidya




