JNI之Java实现远程打印

news2024/11/26 12:37:20

打印机是最常见的办公设备了。一般情况下如果需要实现打印,可通过前端print.js包来完成。但是,如果要实现智能办公打印,就可以使用JNI技术、封装接口、远程调用实现完成。

导包

jacob:Java COM Bridge

<dependency>
   <groupId>net.sf.jacob-project</groupId>
   <artifactId>jacob</artifactId>
   <version>1.14.3</version>
</dependency>

下载:jacob-1.18-x64.dll

接口开发

service

/**
    * @Author lyonardo
    * @Description 打印
    * @Date 16:20 2020/1/20
    * @Param [filePath, startMsg, endMsg, cause, departId]
    * @return com.xxx.basic.response.ReturnData
    **/
    @Override
    public ReturnData excelPrint(String filePath, Long startMsg, Long endMsg, String cause, Integer departId) {
        try {
            //下载驱动
            FileUtil.saveUrlAs(fileServerPath+"/file/", "jacob-1.18-x64.dll", "C:/Windows/System32", "GET");
            String excelName = "xx市中级人民法院办理减刑案件情况统计表";
            String outFilename = buildOutFilename(excelName,startMsg,endMsg);
            //判断文件是否已经生成
            String excelDownloadPath = "";
            if(FileUtils.directoryContains(new File("/rpcs/excel"), new File("/rpcs/excel/download"+"/"+outFilename))){
                excelDownloadPath = "/rpcs/excel/download"+"/"+outFilename;
            }else{
                CaseStatVo caseStatVo = getCaseStatVo(startMsg, endMsg, cause, departId);
                ExportUtils.excelWrite(fileServerPath, caseStatVo, filePath,outFilename, JodaTimeUtil.formatDate2ToString(startMsg, endMsg));
                excelDownloadPath = "/rpcs/excel/download"+"/"+outFilename;
            }
            //打印指定文件名文件
            Integer i = PrintUtil.printOfficeFile(excelDownloadPath);
            if (1 == i) return ReturnData.operateSuncess();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ReturnData.operateFail();
    }

PrintUtil封装

/**
 * @Author lyonardo
 * @Description Office打印
 * @Date 14:49 2019/9/23
 * @Param [filePath 文件路径]
 * @return boolean
**/
public static Integer printOfficeFile(String filePath) {
            String postfixString = FileUtil.getFilePathExtensions(filePath);
            if (postfixString.equalsIgnoreCase("xls")
                    || postfixString.equalsIgnoreCase("xlsx")) {
                /**
                 * 功能:实现excel打印工作
                 */
                ComThread.InitSTA();
                ActiveXComponent xl = new ActiveXComponent("Excel.Application");
                try {
                    // System.out.println("version=" +
                    // xl.getProperty("Version"));
                    // 不打开文档
                    Dispatch.put(xl, "Visible", new Variant(false));
                    Dispatch workbooks = xl.getProperty("Workbooks")
                            .toDispatch();
                    // 打开文档
                    Dispatch excel = Dispatch.call(workbooks, "Open",
                            filePath).toDispatch();
                    // 横向打印
                    //     Dispatch currentSheet = Dispatch.get(excel, "ActiveSheet")
                    //       .toDispatch();
                    //     Dispatch pageSetup = Dispatch
                    //       .get(currentSheet, "PageSetup").toDispatch();
                    //     Dispatch.put(pageSetup, "Orientation", new Variant(2));
                    //每张表都横向打印
                    Dispatch sheets = Dispatch.get(excel, "Sheets")
                            .toDispatch();
                    // 获得几个sheet
                    int count = Dispatch.get(sheets, "Count").getInt();
                    //     System.out.println(count);
                    for (int j = 1; j <=count; j++) {
                        Dispatch sheet = Dispatch.invoke(sheets, "Item",
                                Dispatch.Get, new Object[] { new Integer(j) },
                                new int[1]).toDispatch();
                        Dispatch pageSetup = Dispatch.get(sheet, "PageSetup").toDispatch();
                        Dispatch.put(pageSetup, "Orientation", new Variant(2));
                        Dispatch.call(sheet, "PrintOut");
                    }
                    // 开始打印
                    if (excel != null) {
                        //Dispatch.call(excel, "PrintOut");
                        //增加以下三行代码解决文件无法删除bug
                        Dispatch.call(excel, "save");
                        Dispatch.call(excel,  "Close" ,  new  Variant(true));
                        excel=null;
                    }
                    xl.invoke("Quit", new Variant[] {});
                    xl=null;
                    return 1;
                } catch (Exception e) {
                    e.printStackTrace();
                    return 0;
                } finally {
                    // 始终释放资源
                    ComThread.Release();
                }
            }
            else if (postfixString.equalsIgnoreCase("doc")
                    || postfixString.equalsIgnoreCase("docx")) {
                ComThread.InitSTA();
                ActiveXComponent wd = new ActiveXComponent("Word.Application");
                try {
                    // 不打开文档
                    Dispatch.put(wd, "Visible", new Variant(false));
                    Dispatch document = wd.getProperty("Documents")
                            .toDispatch();
                    // 打开文档
                    Dispatch doc = Dispatch.invoke(document, "Open",
                            Dispatch.Method, new Object[] { filePath },
                            new int[1]).toDispatch();
                    // 开始打印
                    if (doc != null) {
                        Dispatch.call(doc, "PrintOut");
                        Dispatch.call(doc, "save");
                        Dispatch.call(doc,  "Close" ,  new  Variant(true));
                        doc=null;
                    }
                    wd.invoke("Quit", new Variant[] {});
                    wd=null;
                    return 1;
                } catch (Exception e) {
                    e.printStackTrace();
                    return 0;
                } finally {
                    // 始终释放资源
                    ComThread.Release();
                }
            }else {
                return 0;
            }
}

测试

  @Test
  public void test(){
        String filePath  = "C:/Users/Administrator/Desktop/xx市中级人民法院办理减刑案件情况统计表.xlsx";
        //String printerName = "FX DocuPrint M115 b";//打印机名包含字串
        PrintUtil.printOfficeFile(filePath);
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/847924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python实现简单的爬虫功能

前言 Python是一种广泛应用于爬虫的高级编程语言&#xff0c;它提供了许多强大的库和框架&#xff0c;可以轻松地创建自己的爬虫程序。在本文中&#xff0c;我们将介绍如何使用Python实现简单的爬虫功能&#xff0c;并提供相关的代码实例。 如何实现简单的爬虫 1. 导入必要的…

7 个最佳Node.js日志记录库和聚合器

日志记录是软件测试的重要组成部分。当我们知道错误是什么以及代码中出现问题的确切行时&#xff0c;调试应用程序要容易得多。 在本文中&#xff0c;我们将探讨与 Node.js 中的日志记录相关的各种概念&#xff0c;包括七个流行的日志记录库和聚合器&#xff0c;您可以使用它们…

【Linux进阶之路】进程(上)

文章目录 前言一、操作系统加载过程二、进程1.基本概念2.基本信息①运行并观察进程②创建子进程③僵尸与孤儿进程&#xff08;父子进程衍生出来的问题&#xff09;1. 僵尸进程&#xff08;Zombie状态&#xff09;2. 孤儿进程 3.基本状态①操作系统的状态&#xff08;统一&#…

计算机视觉--距离变换算法的实战应用

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 计算机视觉CV是人工智能一个非常重要的领域。 在本次的距离变换任务中&#xff0c;我们将使用D4距离度量方法来对图像进行处理。通过这次实验&#xff0c;我们可以更好地理解距离度量在计算机视觉中的应用。希望大家对计算…

栈和队列(二) 队列操作详解及栈与队列的相互实现

文章目录 四、队列1、什么是队列2、队列的基本操作Queue.hQueue.c初始化队列队尾入队列队头出队列获取队列头部元素获取队列队尾元素获取队列中有效元素个数检测队列是否为空&#xff0c;如果为空返回非零结果&#xff0c;如果非空返回0销毁队列 五、设计循环队列六、栈与队列的…

virt-manager上安装ubuntu22.04虚拟机

文章目录 前言一、镜像下载二、 virt-manager新建机器2.1 选择安装来源类型2.2 选择ISO文件2.3 设置CPU数量和内存容量2.4 设置硬盘容量2.5 设置虚拟机类型&#xff0c;勾选配置按钮2.6 修改硬盘驱动类型2.7 修改网卡驱动类型2.8 设置显示器类型2.9 开始安装 三、操作系统安装3…

Von Maur, Inc EDI 需求分析

Von Maur, Inc 是一家历史悠久的卖场&#xff0c;成立于19世纪&#xff0c;总部位于美国。作为一家知名的零售商&#xff0c;Von Maur 主要经营高端时装、家居用品和美妆产品。其使命是为顾客提供优质的产品和无与伦比的购物体验。多年来&#xff0c;Von Maur 凭借其卓越的服务…

计算机视觉应用方向

计算机视觉可以大致有以下几个方向&#xff08;更详细的可以参考papers with code&#xff09;&#xff1a; 图像分类目标检测图像分割图像生成风格迁移超分辨率 1. 图像分类 图像分类是是视觉识别中的一项基本任务&#xff0c;目的是分辨整个图像并将其分类。 1.1 常用数据…

php使用get和post传递数据出现414 Request-URI Too Large的解决方案

递数据出现414 Request-URI Too Large的解决方案 一、Request-URI Too Large的原因二、GET与POST三、项目分析1.读取源数据2.将读取的到数据&#xff0c;进行传递3.ajax获取传递的数据并传递到后台4.传递数据5.解决方案 一、Request-URI Too Large的原因 “Request-URI Too La…

如果你不只是个点工,那你应该知道 前后端分离与不分离的区别

Web 应用的开发主要有两种模式&#xff1a; 前后端不分离 前后端分离 理解它们的区别有助于我们进行对应产品的测试工作。 前后端不分离 在早期&#xff0c;Web 应用开发主要采用前后端不分离的方式&#xff0c;它是以后端直接渲染模板完成响应为主的一种开发模式。以前后端…

理想汽车:中国电动汽车领域最有投资价值的公司?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;尽管面临着价格和中国电动汽车市场需求放缓的压力&#xff0c;但理想汽车&#xff08;LI&#xff09;在6月份还是交付了32,575辆电动汽车&#xff0c;并且超过了竞争对手蔚来&a…

element-plus:el-date-picker日期只选择年月不要日

<el-date-picker v-model"value" type"month" format"YYYY-MM" value-format"YYYY-MM" />使用format属性将时间显示格式修改为YYYY–MM 年月格式 使用value-format将绑定值的格式修改为YYYY–MM年月格式

DNS解析过程实践分析【nslookup演示】

基本原理 首先一句话概括&#xff0c;DNS就是做域名到IP的映射&#xff0c;rdns表示IP到域名的映射。 怎么映射&#xff0c;其中传递的报文&#xff0c;以及如何进行进行扫描&#xff0c;记录类型都大有讲究。涉及到网络空间测绘当中的DNS扫描&#xff0c;dos也有DNS的相关应…

企升编辑器word编写插件

面向用户群体招投标人员&#xff0c;用统一的模板来编写标书&#xff0c;并最终合并标书。项目经理&#xff0c;编写项目开发计划书&#xff0c;项目验收文档等。开发人员&#xff0c;编写项目需求规格说明书、设计说明书、技术总结等文档。其他文档编写工作量较多的岗位人员。…

小红书 KOL 种草执行策略揭秘:打造爆款产品,提升品牌影响力

随着互联网的普及和社交媒体的发展&#xff0c;小红书成为了众多年轻人购物决策的重要参考平台。小红书 KOL 种草作为一种新兴的营销方式&#xff0c;以其强大的传播力和影响力&#xff0c;越来越受到各大品牌的重视。本文伯乐网络传媒将给大家深入探讨小红书 KOL 种草的执行策…

TS协议概念及传输流程

TS协议之PAT&#xff08;节目关联表&#xff09;TS协议之PMT&#xff08;节目映射表&#xff09;TS协议之PES&#xff08;ES数据包&#xff09; 概要 TS协议是一种媒体流封装协议&#xff0c;类似于MP4&#xff0c;FLV等&#xff0c;可以将编码好的视频流(H164,H265等)和音频…

大数据——推荐系统

1 推荐系统的发展 推荐系统是指面对没有需求的用户在进入产品时&#xff0c;要给用户推荐什么东西&#xff0c;现在的APP基本上都会采用推荐系统。 从一开始的1990s开始的门户网站&#xff0c;像Yahoo、搜狐和Hao123等等&#xff0c;都是基于分类目录的网页导航网站&#xff0…

【Elasticsearch】学好Elasticsearch系列-聚合查询

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 先看后赞&#xff0c;养成习惯。 点赞收藏&#xff0c;人生辉煌。 文章目录 概念doc values 和 fielddatamulti-fields&#xff08;多字段&#xff09;类型聚合分类分桶聚合Histogram 聚合 指标聚合Percentil…

用chatGPT从左右眼图片生成点云数据

左右眼图片 需求 需要将左右眼图像利用视差生成三维点云数据 先问问chatGPT相关知识 进一步问有没有现成的软件 chatGPT提到了OpenCV&#xff0c;我们让chatGPT用OpenCV写一个程序来做这个事情 当然&#xff0c;代码里面会有一些错误&#xff0c;chatGPT写的代码并不会做模…

笔记本WIFI连接无网络【实测有效,不用重启电脑】

笔记本Wifi连接无网络实测有效解决方案 问题描述&#xff1a; 笔记本买来一段时间后&#xff0c;WIFI网络连接开机一段时间还正常连接&#xff0c;但是过一段时间显示网络连接不上&#xff0c;重启电脑太麻烦&#xff0c;选择编写重启网络脚本解决。三步解决问题。 解决方案&a…