Java编程:如何通过打印机IP地址直接打印PDF文件
通过IP地址直接打印PDF(无需本地安装打印机)
针对你的需求,下面提供两种无需本地安装打印机、直接通过IP打印PDF的可行方案:
方案1:利用javax.print直接连接IPP网络打印机
javax.print其实支持直接通过IPP(互联网打印协议)连接网络打印机,不需要在本地安装驱动。关键是要构造正确的IPP打印机URI,而非依赖本地已安装的打印服务。
代码示例
import javax.print.*; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.PrintRequestAttributeSet; import javax.print.attribute.standard.MediaSizeName; import java.io.FileInputStream; import java.io.FileNotFoundException; public class IppPdfPrinter { public static void main(String[] args) { String printerIP = "192.168.1.100"; // 替换为你的打印机IP String printerQueue = "default"; // 多数打印机默认队列为default,可根据实际调整 String pdfPath = "/path/to/your/document.pdf"; // 替换为PDF文件路径 // 构造IPP打印机地址,默认端口631 String printerUri = "ipp://" + printerIP + ":631/printers/" + printerQueue; DocFlavor pdfFlavor = DocFlavor.INPUT_STREAM.PDF; // 查找目标打印服务 PrintService targetService = null; try { // 优先通过URI直接查找 targetService = PrintServiceLookup.lookupPrintServiceByURI(new java.net.URI(printerUri)); } catch (Exception e) { // 若直接查找失败,遍历所有可用服务匹配 PrintService[] services = PrintServiceLookup.lookupPrintServices(pdfFlavor, null); for (PrintService service : services) { if (service.getURI().toString().equals(printerUri)) { targetService = service; break; } } } if (targetService != null) { PrintRequestAttributeSet printAttrs = new HashPrintRequestAttributeSet(); printAttrs.add(MediaSizeName.ISO_A4); // 设置打印纸张尺寸 try (FileInputStream pdfStream = new FileInputStream(pdfPath)) { Doc printDoc = new SimpleDoc(pdfStream, pdfFlavor, null); DocPrintJob printJob = targetService.createPrintJob(); printJob.print(printDoc, printAttrs); System.out.println("打印任务已提交"); } catch (FileNotFoundException | PrintException e) { e.printStackTrace(); } } else { System.out.println("未找到指定的IPP网络打印机,请检查IP、队列名或打印机IPP服务是否开启"); } } }
方案2:通过Socket直接发送PDF至打印机RAW端口
大部分网络打印机开放9100端口支持RAW打印,直接将PDF文件流发送到该端口即可,无需依赖打印服务框架,实现更轻量化。
代码示例
import java.io.FileInputStream; import java.io.OutputStream; import java.net.Socket; public class RawPdfPrinter { public static void main(String[] args) { String printerIP = "192.168.1.100"; // 替换为你的打印机IP int rawPort = 9100; // 打印机默认RAW端口,若修改过需对应调整 String pdfPath = "/path/to/your/document.pdf"; try (Socket printerSocket = new Socket(printerIP, rawPort); OutputStream printerOut = printerSocket.getOutputStream(); FileInputStream pdfStream = new FileInputStream(pdfPath)) { byte[] buffer = new byte[1024]; int bytesRead; // 逐字节发送PDF文件流 while ((bytesRead = pdfStream.read(buffer)) != -1) { printerOut.write(buffer, 0, bytesRead); } printerOut.flush(); System.out.println("PDF文件已发送至打印机"); } catch (Exception e) { e.printStackTrace(); System.out.println("打印失败,请检查打印机IP、端口是否开放,或打印机是否支持RAW打印"); } } }
注意事项
- 方案1要求打印机开启IPP服务,默认端口631,若打印机修改了端口需同步调整URI中的端口号
- 方案2的9100端口是多数打印机的默认RAW打印端口,若打印机关闭了该功能则无法使用,需在打印机后台确认端口状态
- 你之前尝试转PS无效,大概率是因为打印机不支持PS格式,优先选择直接发送PDF的方式更可靠
内容的提问来源于stack exchange,提问作者Avian Driyanto
相关产品推荐
相关产品推荐

