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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:35:23