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

Flutter:通过IP地址直接打印PDF至WiFi热敏打印机(无预览)

解决方案

为什么Printing包满足不了需求

Printing.layoutPdf本质是调用Android系统打印服务,必然会弹出系统打印预览界面,没法跳过这一步直接直连WiFi打印机。

直连WiFi热敏打印机的实现方法

1. 核心思路

直接通过Socket建立与打印机的TCP连接,把PDF字节数据发送到打印机的指定端口(多数热敏打印机默认端口是9100),完全绕开系统打印框架。

2. 代码实现

不需要额外依赖Dart标准库之外的包,直接用dart:io的Socket API:

import 'dart:io';
import 'dart:typed_data';

Future<void> printToWifiPrinter(String printerIp, int port, Uint8List pdfBytes) async {
  try {
    // 连接打印机,超时时间设为5秒
    final socket = await Socket.connect(printerIp, port, timeout: const Duration(seconds: 5));
    
    // 发送PDF字节流
    socket.add(pdfBytes);
    await socket.flush(); // 确保数据全部发送
    
    // 关闭连接
    await socket.close();
    print("打印任务已发送");
  } on SocketException catch (e) {
    print("连接失败: ${e.message}");
    // 这里可以加Toast或弹窗提示用户连接出错
  } catch (e) {
    print("打印出错: $e");
  }
}

// 调用方式(替换成你的打印机IP、端口和PDF数据)
// await printToWifiPrinter("192.168.1.105", 9100, pdf.save());

3. 必要配置

在Android项目的AndroidManifest.xml里添加网络权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

4. 兼容性处理

如果你的打印机不支持直接打印PDF(部分低端热敏打印机只认ESC/POS指令),需要先把PDF内容转换成ESC/POS格式:

  • 可以用esc_pos_utils等工具包,将PDF页面转成图片或提取文本,再生成对应的打印指令
  • 然后把生成的ESC/POS字节数据通过上面的Socket代码发送给打印机

内容的提问来源于stack exchange,提问作者Nitin Gopal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:01:07