You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动