Connect the HP printer via wifi and printer the pdf file.连接局域网打印机,并打印pdf文件。
安卓自带的打印服务由于各种阉割版问题,不考虑。
研究了一下 PrinterShare 暂时先使用wifi方式打印文件。
通过mac或者pc分享打印机,安卓连接同一个局域网的wifi。通过mdns service搜索打印机,基于IPP + cups打印文件。
1.初始化
private String serviceType = "_ipp._tcp";
private String serviceName = "nsdChat";
NsdServiceInfo nsdServiceInfo = new NsdServiceInfo();
nsdServiceInfo.setServiceType(serviceType);
nsdServiceInfo.setServiceName(serviceName);
nsdServiceInfo.setPort(9000);
NsdManager nsdManager = (NsdManager) getApplicationContext().getSystemService(Context.NSD_SERVICE);
2.注册DiscoveryListener,注册ResolveListener
mResolverListener = new NsdManager.ResolveListener() {
......
@Override
public void onServiceResolved(NsdServiceInfo serviceInfo) {
Log.d("printer", "onServiceResolved:IP " + serviceInfo.getHost());
Log.d("printer", "onServiceResolved:Port " + serviceInfo.getPort());
}
};
mDiscoveryListener = new NsdManager.DiscoveryListener() {
......
@Override
public void onServiceFound(NsdServiceInfo serviceInfo) {
Log.d("printer", "onServiceFound: " + serviceInfo.getServiceName());
nsdManager.resolveService(serviceInfo,mResolverListener);
}
......
};
}
3.开始寻找服务
nsdManager.discoverServices(serviceType, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
pdf使用iText5生成
CupsClient cupsClient = new CupsClient(new URL("http://192.168.223.1:631"));
List<CupsPrinter> cupsPrinterList = cupsClient.getPrinters();
CupsPrinter printer = cupsClient.getDefaultPrinter();
InputStream inStream = this.getResources().openRawResource(R.raw.pdf);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buff = new byte[inStream.available()];
int i = Integer.MAX_VALUE;
while ((i = inStream.read(buff, 0, buff.length)) > 0) {
baos.write(buff, 0, i);
}
PrintJob.Builder builder = new PrintJob.Builder(baos.toByteArray()).userName("user").copies(1);
printer.print(builder.build());
打印机分享wifi,手机直连打印机。通过mdns service搜索打印机,socket连接打印机,发送打印指令。
Socket socket = new Socket("192.168.223.1", 9100);
但是这里无论我发生什么数据,打印机都没有反应。应该是数据格式的问题。
之后通过抓包PrinterShare 的数据,发现它发送了 PCL 格式数据。
可通过 genPCLm.cpp 生成。由于ndk 不熟,没有深入研究。 这里 有所有惠普打印机的适配信息。