Java获取打印机打印图片

功能实现:输入图片和数量即可自动打印

import com.sun.jna.platform.win32.Winspool;
import com.sun.jna.platform.win32.WinspoolUtil;

import javax.print.*;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.Size2DSyntax;
import javax.print.attribute.standard.JobName;
import javax.print.attribute.standard.MediaPrintableArea;
import javax.print.attribute.standard.OrientationRequested;
import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Locale;

public class Test {

    private static long j = 1;

    private static String picPath = "F:\\迅雷下载\\8035MS.jpg";

    public static void main(String[] args) {
        // 构建打印请求属性集
        DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
        // 设置打印格式
        PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
        // 查找所有的打印服务
        PrintService[] printServices = PrintServiceLookup.lookupPrintServices(flavor, pras);
        // 因为只是测试,这里我直接用第一个了
        PrintService printService = printServices[0];
        String printName = printService.getName();
        // 判断当前打印机状态
        Winspool.PRINTER_INFO_2 printerInfo2 = WinspoolUtil.getPrinterInfo2(printName);
        if (printerInfo2.Status != 0) {
            return;
        }
        File picFile = new File(picPath);
        if (!picFile.exists() || !picFile.isFile()) {
            return;
        }
        String fileName = picFile.getName();
        // 获取图片后缀名,设置打印文件格式
        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
        switch (suffix) {
            case "jpg":
            case "jpeg":
                flavor = DocFlavor.INPUT_STREAM.JPEG;
                break;
            case "png":
                flavor = DocFlavor.INPUT_STREAM.PNG;
                break;
            case "pdf":
                flavor = DocFlavor.INPUT_STREAM.PDF;
                break;
            case "gif":
                flavor = DocFlavor.INPUT_STREAM.GIF;
            default:
                break;
        }
        // 设置打印文件名
        pras.add(new JobName(fileName, Locale.CHINA));
        // 设置打印方向
        pras.add(OrientationRequested.LANDSCAPE);
        // 设置打印区域
        MediaPrintableArea mp = new MediaPrintableArea(0, 100, 230, 203, Size2DSyntax.MM);
        pras.add(mp);
        try {
            FileInputStream fis = new FileInputStream(picFile);
            HashDocAttributeSet das = new HashDocAttributeSet();

            for (long i = 0; i < j; i++) {
                // 使用打印服务生成打印任务
                DocPrintJob job = printService.createPrintJob();
                // 获取需要打印的文档类doc
                SimpleDoc doc = new SimpleDoc(fis, flavor, das);
                // 监听打印任务
                job.addPrintJobListener(new PrintJobListener() {
                    @Override
                    public void printDataTransferCompleted(PrintJobEvent pje) {
                        System.out.println("成功发送任务:" + fileName);
                    }

                    @Override
                    public void printJobCompleted(PrintJobEvent pje) {
                        System.out.println("打印任务完成!");
                    }

                    @Override
                    public void printJobFailed(PrintJobEvent pje) {
                        System.out.println("打印任务失败:" + fileName);
                    }

                    @Override
                    public void printJobCanceled(PrintJobEvent pje) {
                        System.out.println("取消打印任务!");
                    }

                    @Override
                    public void printJobNoMoreEvents(PrintJobEvent pje) {
                        System.out.println("没有更多方法提供打印机调用!");
                    }

                    @Override
                    public void printJobRequiresAttention(PrintJobEvent pje) {
                        System.out.println("纸张已用完");
                    }
                });
                job.print(doc, pras);
            }
        } catch (PrintException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

输出结果:
在这里插入图片描述
注意:
1.设置打印方向和区域必须是在查看打印服务后面,不然好像是查找不到打印服务的
2.在监听任务时,printJobCompleted方法好像是没有触发到的(原因我也不太知道。。。)

打印机功能实现基本就这些,因为只是测试用的所有就图片和数量都直接写死了,仅当参考。
由于第一次写博客所有还是有点紧张的,也不太知道写什么好。。。所有只是把最近的项目基本功能写一下当做总结了。。。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以通过使用Java打印API来连接打印机打印图片。以下是一个简单的示例代码,它演示如何使用IP地址连接打印机打印图片: ``` import java.awt.Graphics; import java.awt.Image; import java.awt.print.PageFormat; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.net.InetAddress; import javax.swing.ImageIcon; public class PrintImageExample implements Printable { public static void main(String[] args) throws Exception { // 获取打印机IP地址 String printerIP = "192.168.1.100"; InetAddress address = InetAddress.getByName(printerIP); // 加载要打印图片 Image img = new ImageIcon("path/to/image.png").getImage(); // 创建PrinterJob对象并设置打印机 PrinterJob job = PrinterJob.getPrinterJob(); job.setPrintService(job.getPrintService()); // 设置打印属性 PageFormat pf = job.defaultPage(); job.setPrintable(new PrintImageExample(), pf); // 打印图片 job.print(); } @Override public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { if (pageIndex != 0) { return NO_SUCH_PAGE; } // 在打印页面上绘制图像 Image img = new ImageIcon("path/to/image.png").getImage(); graphics.drawImage(img, 0, 0, null); return PAGE_EXISTS; } } ``` 在上面的示例中,我们首先获取打印机的IP地址,并加载了要打印图片。然后,我们创建了一个PrinterJob对象,并将要使用的打印机设置为默认打印机。最后,我们实现了Printable接口的print方法,在打印页面上绘制图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值