功能实现:输入图片和数量即可自动打印
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方法好像是没有触发到的(原因我也不太知道。。。)
打印机功能实现基本就这些,因为只是测试用的所有就图片和数量都直接写死了,仅当参考。
由于第一次写博客所有还是有点紧张的,也不太知道写什么好。。。所有只是把最近的项目基本功能写一下当做总结了。。。