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