Flutter通过wifip2p连接打印机后如何发送URL/Assets的PDF数据打印
Flutter WiFi P2P连接打印机后打印PDF的实现步骤
1 前置操作:确认连接状态并获取打印机IP
连接打印机成功后,先通过WiFi P2P插件的状态监听和信息查询接口,拿到打印机的局域网IP:
// 监听WiFi P2P连接状态 WifiP2P.connectionChangeEvent.listen((isConnected) async { if (isConnected) { // 连接成功后获取已连接设备的信息,实际字段名以你使用的wifip2p插件定义为准 final connectedDevice = await WifiP2P.getConnectedPeerInfo(); final printerIp = connectedDevice.ip; // 部分插件字段名为groupOwnerAddress // 拿到IP后即可执行打印逻辑 _startPrintTask(printerIp); } });
2 加载PDF为字节流
根据你的PDF来源,选择对应方式读取PDF为Uint8List格式:
2.1 读取Assets目录内的PDF
import 'package:flutter/services.dart'; Future<Uint8List> loadPdfFromAssets(String assetPath) async { final byteData = await rootBundle.load(assetPath); return byteData.buffer.asUint8List(); }
2.2 读取网络URL的PDF
import 'package:http/http.dart' as http; Future<Uint8List> loadPdfFromUrl(String pdfUrl) async { final response = await http.get(Uri.parse(pdfUrl)); if (response.statusCode == 200) { return response.bodyBytes; } throw Exception('PDF文件下载失败'); }
3 发送PDF数据到打印机
绝大多数支持WiFi直连的打印机默认开放9100端口用于RAW打印,可直接通过Socket将PDF字节发送到该端口完成打印:
import 'dart:io'; Future<void> sendPdfToPrinter(Uint8List pdfBytes, String printerIp, {int port = 9100}) async { Socket? socket; try { // 建立Socket连接,超时时间可根据实际情况调整 socket = await Socket.connect(printerIp, port, timeout: const Duration(seconds: 15)); // 写入PDF字节流 socket.add(pdfBytes); // 等待数据全部发送完成 await socket.flush(); print('打印任务已发送至打印机'); } catch (e) { print('打印失败:$e'); } finally { // 关闭Socket连接 await socket?.close(); } }
最后在_startPrintTask方法中拼接逻辑即可:
Future<void> _startPrintTask(String printerIp) async { // 加载PDF,二选一即可 final pdfBytes = await loadPdfFromAssets('assets/demo.pdf'); // final pdfBytes = await loadPdfFromUrl('https://xxx.com/demo.pdf'); // 发送打印 await sendPdfToPrinter(pdfBytes, printerIp); }
兼容方案
如果打印机打印乱码或无反应,说明该型号不支持直接解析PDF,可先通过pdf_render库将PDF逐页渲染为位图,再根据打印机支持的指令协议(常见为ESC/POS、PCL)将位图转换为对应打印指令流后发送即可。
内容的提问来源于stack exchange,提问作者Jungwon
相关产品推荐
相关产品推荐

