//设置打印属性 构造一个新的空打印请求属性集。
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
pras.add(new Copies(3));//打印份数,3份
//设置打印数据的格式DocFlavor.BYTE_ARRAY.PNG MIME 类型 = "image/png",打印数据表示形式类名 = "[B"(byte 数组)的 DocFlavor。
DocFlavor flavor = DocFlavor.BYTE_ARRAY.PNG;
//查找所有符合条件的打印服务 lookupPrintServices(flavor, pras);查找能够打印指定 DocFlavor 的 PrintService。
PrintService[] printService = PrintServiceLookup.lookupPrintServices(flavor, pras);
//将所有查找出来的打印机与自己想要的打印机进行匹配,找出自己想要的打印机
LookUpPrint p=new LookUpPrint();
PrintService myPrintService = p.GetPrintService("printName");
//PrinterJob 类是控制打印的主要类。应用程序调用此类中的方法设置作业、(可选地)调用与用户的打印对话框,然后打印作业的页面。
//getPrinterJob() 创建并返回初始化时与默认打印机关联的 PrinterJob。 打印任务
PrinterJob job = PrinterJob.getPrinterJob();
//setPrintService(PrintService service) 将此 PrinterJob 与新的 PrintService 关联。 把任务挂到服务上
job.setPrintService(myPrintService);
//PDDocument 这是PDF文档的内存中表示。当不再需要文档时,必须调用#close()方法。
//load(File file) 解析一个PDF。不受限制的主存将用于缓冲PDF流。
PDDocument document = PDDocument.load(new File("printPath"));//将PDF文档解析为PDF流存入到内存中
//Paper 类描述一张纸的物理特征。
Paper paper = new Paper();
paper.setSize(252, 141); // 1/72 inch //设置此 Paper 对象的宽和高,它表示要用来打印的页面的属性。
paper.setImageableArea(0, 5, paper.getWidth(), paper.getHeight());
// setImageableArea:设置此 Paper 的可成像区域。可成像区域是页面上用来打印的区域。 左上角的 X 坐标,Y 坐标,区域宽度,高度
//PageFormat 类描述要打印的页面大小和方向。
PageFormat pageFormat = new PageFormat();
pageFormat.setPaper(paper);//为此 PageFormat 设置 Paper 对象
//Book 类提供文档的表示形式,该文档的页面可以使用不同的页面格式和页面 painter。此类使用 Pageable 接口与 PrinterJob 交互。
Book book = new Book();
//将多个页面追加到此 Book 的尾部。
book.append(new PDFPrintable(document), pageFormat, document.getNumberOfPages());
//查询 document,以获得页面数和 Pageable 实例 document 中保存的每个页面的 PageFormat 和 Printable。
job.setPageable(new PDFPageable(document, Orientation.PORTRAIT));
job.setPageable(book);
//打印一组页面。
job.print();