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

Android通过Wi-Fi Direct向HP移动打印机打印PDF出现乱码求助

问题分析与解决方案

端口选择:9100 vs 631

  • 9100是RAW打印端口,直接发送原始数据到打印机。HP桌面打印机通常内置PDF解析引擎,能直接识别并打印PDF;但HP移动打印机定位轻量化,大多不支持直接解析RAW端口传入的PDF,会把PDF字节流误判为PostScript或其他原始打印语言,最终输出乱码。
  • 631是IPP(Internet Printing Protocol)端口,这是标准网络打印协议,会封装打印作业元数据(如文件类型、打印参数),明确告知打印机如何处理传入文件。对于不支持RAW端口PDF解析的移动打印机,改用631端口的IPP协议是更可靠的解决方向。

你遗漏的关键问题

  1. 打印机的RAW端口能力差异
    并非所有HP打印机都支持通过9100端口直接打印PDF。移动打印机受限于硬件和固件设计,通常只支持PostScript、PCL这类传统打印语言,或仅接受IPP协议封装的打印请求,直接发原始PDF会被当作未知打印代码输出。

  2. 异步写入的未等待问题
    你的CopyFileJava方法中调用了WriteAsync但未使用await,这会导致写入操作在后台异步执行,可能流或Socket已关闭,写入仍未完成,进而引发打印数据不完整或损坏。

  3. 缺少打印作业的协议封装
    即便切换到631端口,也不能像9100端口那样直接发送PDF字节流,必须按照IPP协议规范构建打印请求,明确指定文件类型为application/pdf,让打印机正确识别并解析内容。

代码修改建议

1. 修复异步写入问题

先修正CopyFileJava的异步逻辑,确保写入操作完成后再执行后续步骤:

private static async Task CopyFileJava(OutputStream mmOutputStream, FileInputStream inputStream)
{
    byte[] bytes = new byte[16 * 1024];
    int count;
    while ((count = inputStream.Read(bytes)) > 0)
    {
        await mmOutputStream.WriteAsync(bytes, 0, count);
        // 刷新输出流,确保数据即时发送到打印机
        await mmOutputStream.FlushAsync();
    }
}

调用该方法时也需添加await:

await CopyFileJava(mmOutputStream, inputStream);

2. 切换到IPP协议(631端口)的实现思路

使用631端口时,需通过HTTP POST发送符合IPP规范的请求:

  • 构建Print-Job类型的IPP请求,指定文件类型为application/pdf
  • 请求地址格式为http://{host}:631/printers/{打印机名称}(需提前获取目标移动打印机的名称,可通过IPP设备发现接口查询)
  • 将PDF文件作为请求的二进制附件发送

3. 备选方案:转换打印语言

若不想引入IPP协议的复杂度,可先将PDF转换为移动打印机支持的打印语言(如PostScript),再通过9100端口发送。但此方案需要额外集成PDF转换库,实现成本较高。

内容的提问来源于stack exchange,提问作者Sandeepani Senevirathna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:07:20