您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

java调用打印机工具类

时间:2019-08-05 13:25:19  来源:  作者:

maven

 <!-- https://mvnrepository.com/artifact/org.Apache.pdfbox/pdfbox -->
<dependency>
 <groupId>org.apache.pdfbox</groupId>
 <artifactId>pdfbox</artifactId>
 <version>2.0.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.jacob/jacob -->
<dependency>
 <groupId>com.jacob</groupId>
 <artifactId>jacob</artifactId>
 <version>1.10</version>
</dependency>

JAVA代码

package com.zxh.util;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import javax.print.*;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.OrientationRequested;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
/**
 * java调用打印机工具类
 * @author sdd
 *
 */
public class PrintUtil {
 /**
 * 竖屏模式
 */
 public static OrientationRequested PORTRAIT = OrientationRequested.PORTRAIT;
 /**
 * 横屏模式
 */
 public static OrientationRequested LANDSCAPE = OrientationRequested.LANDSCAPE;
 /**
 * 获取全部打印设备信息
 * @return 返回全部能用的打印服务的List
 */
 public static List<PrintService> getDeviceList() {
 // 构建打印请求属性集
 HashPrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
 // 设置打印格式,因为未确定类型,所以选择autosense
 DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
 // 查找所有的可用的打印服务
 PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);
 List<PrintService> list = Arrays.asList(printService);
 return list;
 }
 /**
 * 根据文件类型不同调用不同代码去打印
 * @param filePath 文件路径
 */
 public static void print(String filePath) throws Exception {
 PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
 String defaultDeviceName = printService.getName();
 print(filePath, defaultDeviceName);
 }
 /**
 * 额外传入一个 AfterPrint,会在打印完成后调用 afterPrint.run()
 * @param filePath
 * @param afterPrint
 * @throws Exception
 */
 public static void print(String filePath, AfterPrint afterPrint) throws Exception {
 print(filePath);
 afterPrint.run();
 }
 /**
 * 根据文件类型不同调用不同代码去打印
 * @param filePath 文件路径
 * @param deviceName 设备名称,传入哪个设备的名称,就让哪个设备去打印
 */
 public static void print(String filePath, String deviceName) throws Exception{
 List<PrintService> list = getDeviceList();
 PrintService printService = null;
 for (PrintService p : list) {
 if(p.getName().equals(deviceName)) {
 printService = p;
 break;
 }
 }
 if(printService == null) {
 throw new Exception("Device not found");
 }
 String type = filePath.replaceAll(".*\.","");
 if("jpg".equalsIgnoreCase(type)) {
 normalPrint(new File(filePath), DocFlavor.INPUT_STREAM.JPEG, printService);
 return;
 }
 if("jpeg".equalsIgnoreCase(type)) {
 normalPrint(new File(filePath), DocFlavor.INPUT_STREAM.JPEG, printService);
 return;
 }
 if("gif".equalsIgnoreCase(type)) {
 normalPrint(new File(filePath), DocFlavor.INPUT_STREAM.GIF, printService);
 return;
 }
 if("pdf".equalsIgnoreCase(type)) {
 printPDF(new File(filePath), DocFlavor.INPUT_STREAM.PNG, printService);
 return;
 }
 if("png".equalsIgnoreCase(type)) {
 normalPrint(new File(filePath), DocFlavor.INPUT_STREAM.PNG, printService);
 return;
 }
 if("doc".equalsIgnoreCase(type)) {
 printword(filePath, deviceName);
 return;
 }
 if("docx".equalsIgnoreCase(type)) {
 printWord(filePath, deviceName);
 return;
 }
 if("xls".equalsIgnoreCase(type)) {
 printExcel(filePath, deviceName);
 return;
 }
 if("xlsx".equalsIgnoreCase(type)) {
 printExcel(filePath, deviceName);
 return;
 }
 if("ppt".equalsIgnoreCase(type)) {
 printPPT(filePath, deviceName);
 return;
 }
 if("pptx".equalsIgnoreCase(type)) {
 printPPT(filePath, deviceName);
 return;
 }
 }
 /**
 * 会在打印完成后调用 afterPrint.run()
 * @param filePath
 * @param deviceName
 * @param afterPrint
 * @throws Exception
 */
 public static void print(String filePath, String deviceName, AfterPrint afterPrint) throws Exception{
 print(filePath, deviceName);
 afterPrint.run();
 }
 /**
 * javase的打印机打印文件,支持jpg,png,gif,pdf等等
 * @param file 要打印的文件
 * @param flavor 打印格式
 */
 private static void normalPrint(File file, DocFlavor flavor) {
 // 定位默认的打印服务
 PrintService service = PrintServiceLookup
 .lookupDefaultPrintService(); // 显示打印对话框
 normalPrint(file, flavor, service);
 }
 private static void normalPrint(File file, DocFlavor flavor, PrintService service) {
 normalPrint(file, flavor, PORTRAIT, service);
 }
 /**
 * javase的打印机打印文件,支持jpg,png,gif等等
 * @param file 要打印的文件
 * @param service 打印机选择
 * @param requested 设定横屏还是竖屏
 * @param flavor 打印格式
 */
 private static void normalPrint(File file, DocFlavor flavor, OrientationRequested requested, PrintService service) {
 // 构建打印请求属性集
 HashPrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
 pras.add(requested);
 if (service != null) {
 try {
 DocPrintJob job = service.createPrintJob(); // 创建打印作业
 FileInputStream fis = new FileInputStream(file); // 构造待打印的文件流
 DocAttributeSet das = new HashDocAttributeSet();
 Doc doc = new SimpleDoc(fis, flavor, das);
 job.print(doc, pras);
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 }
 /**
 * 打印pdf的方法,因为java内置的打印pdf的方法有病,所以首先需要把pdf转换成png,然后打印png
 * @param file 要打印的文件
 * @param flavor 要打印的文件
 * @param service 打印设备
 */
 private static void printPDF(File file, DocFlavor flavor, PrintService service) {
 try {
 PDDocument doc = PDDocument.load(file);
 PDFRenderer renderer = new PDFRenderer(doc);
 int pageCount = doc.getNumberOfPages();
 for(int i=0;i<pageCount;i++){
 File f = new File(file.getParent() + File.separator + "temp_" + i + ".png");
 BufferedImage image = renderer.renderImageWithDPI(i, 96);
 ImageIO.write(image, "PNG", f);
 normalPrint(f, flavor, LANDSCAPE, service);
 f.delete();
 }
 } catch (IOException e) {
 e.printStackTrace();
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 /**
 * 打印机打印Word
 * @param filepath 打印文件路径
 * @param deviceName 传入哪个设备名称,用哪个设备打印
 */
 private static void printWord(String filepath, String deviceName) {
 if(filepath.isEmpty()){
 return;
 }
 ComThread.InitSTA();
 //使用Jacob创建 ActiveX部件对象:
 ActiveXComponent word=new ActiveXComponent("Word.Application");
 //打开Word文档
 Dispatch doc=null;
 Dispatch.put(word, "Visible", new Variant(false));
 word.setProperty("ActivePrinter", new Variant(deviceName));
 Dispatch docs=word.getProperty("Documents").toDispatch();
 doc=Dispatch.call(docs, "Open", filepath).toDispatch();
 try {
 Dispatch.call(doc, "PrintOut");//打印
 } catch (Exception e) {
 e.printStackTrace();
 }finally{
 try {
 if(doc!=null){
 //关闭文档
 Dispatch.call(doc, "Close",new Variant(0));
 }
 } catch (Exception e2) {
 e2.printStackTrace();
 }
 word.invoke("Quit", new Variant[] {});//关闭进程
 //释放资源
 ComThread.Release();
 }
 }
 /**
 * 打印Excel
 * @param filePath 打印文件路径,形如 E:\temp\tempfile\1494607000581.xls
 * @param deviceName 传入哪个设备名称,用哪个设备打印
 */
 private static void printExcel(String filePath, String deviceName){
 if(filePath.isEmpty()){
 return;
 }
 ComThread.InitSTA();
 ActiveXComponent xl=new ActiveXComponent("Excel.Application");
 try {
 Dispatch.put(xl, "Visible", new Variant(true));
 Dispatch workbooks = xl.getProperty("Workbooks").toDispatch();
 Dispatch excel=Dispatch.call(workbooks, "Open", filePath).toDispatch();
 Dispatch.callN(excel,"PrintOut",new Object[]{Variant.VT_MISSING, Variant.VT_MISSING, new Integer(1),
 new Boolean(false), deviceName, new Boolean(true),Variant.VT_MISSING, ""});
 Dispatch.call(excel, "Close", new Variant(false));
 } catch (Exception e) {
 e.printStackTrace();
 } finally{
 xl.invoke("Quit",new Variant[0]);
 ComThread.Release();
 }
 }
 /**
 * 打印PPT
 * @param filePath
 * @param deviceName
 */
 private static void printPPT(String filePath, String deviceName) {
 File file = new File(filePath);
 File pdfFile = new File(file.getParentFile().getAbsolutePath() + file.getName() + ".pdf");
 ActiveXComponent app = null;
 Dispatch ppt = null;
 try {
 ComThread.InitSTA();
 app = new ActiveXComponent("PowerPoint.Application");
 Dispatch ppts = app.getProperty("Presentations").toDispatch();
 ppt = Dispatch.call(ppts, "Open", filePath, true, true, false).toDispatch();
 Dispatch.call(ppt, "SaveAs", pdfFile.getAbsolutePath(), 32);
 } catch (Exception e) {
 e.printStackTrace();
 throw e;
 } finally {
 if (ppt != null) {
 Dispatch.call(ppt, "Close");
 }
 if (app != null) {
 app.invoke("Quit");
 }
 ComThread.Release();
 }
 try {
 print(pdfFile.getAbsolutePath(), deviceName);
 pdfFile.delete();
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 /**
 * 接口,在打印结束后调用
 */
 public interface AfterPrint {
 void run();
 }
}


Tags:java 打印机   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
maven <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --><dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <ver...【详细内容】
2019-08-05  Tags: java 打印机  点击:(949)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(12)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(22)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条