JNI之Java实现远程打印

打印机是最常见的办公设备了。一般情况下如果需要实现打印,可通过前端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.ledict.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);
  }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vim粘贴内容格式混乱解决方法

问题 复制本地文件内容后&#xff0c;咱贴到vim文本内&#xff0c;格式错乱 解决方法 打开vim配置文件 最后面加入一行 vim /etc/vimrc set pastetoggle<F11> 开发vim文件&#xff0c;进入后先按F11进入交互模式 shift insert 再次粘贴 解决

原型模式(C++)

定义 使用原型实例指定创建对象的种类&#xff0c;然后通过拷贝这些原型来创建新的对象。 应用场景 在软件系统中&#xff0c;经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化&#xff0c;这些对象经常面临着剧烈的变化&#xff0c;但是它们却拥有比较稳定一致的…

SpringCloud Gateway获取请求响应body大小

前提 本文获取请求、响应body大小方法的前提 : 网关只做转发逻辑&#xff0c;不修改请求、相应的body内容。 SpringCloud Gateway内部的机制类似下图&#xff0c;HttpServer&#xff08;也就是NettyServer&#xff09;接收外部的请求&#xff0c;在Gateway内部请求将会通过Htt…

外部排序算法总结

一.内排总结 在之前博客里&#xff0c;博主已经介绍了各种内部排序算法的原理和C语言代码实现&#xff0c;不懂的朋友可以在同系列专栏里选择查看&#xff0c;今天介绍常见排序算法的最后一点&#xff0c;也就是外部排序。在此之前&#xff0c;我们先对外部排序的各种算法做一…

高翔《自动驾驶中的SLAM技术》代码详解 — 第6章 2D SLAM

目录 6.2 扫描匹配算法 6.2.1 点到点的扫描匹配 6.2 扫描匹配算法 6.2.1 点到点的扫描匹配 // src/ch6/test_2dlidar_io.cc // Created by xiang on 2022/3/15. // #include <gflags/gflags.h> #include <glog/logging.h> #include <opencv2/highgui.hpp>…

Redis—全局命令

Redis—全局命令 &#x1f50e;get / set&#x1f50e;常用全局命令keysexistsdelexpirettlkey 的过期策略type Redis 官网 Redis 中的命令不区分大小写 进入 Redis 客户端 redis-cli -h Redis 服务器的 IP 地址 -p Redis 服务器的端口号省略 -h 表示 Redis 服务器的 IP 地址…

OKR管理策略:为开发团队注入动力

引言 在这个快速变化的世界中&#xff0c;公司需要迅速应对市场变化&#xff0c;并保持其目标和战略的清晰性和一致性。而OKR&#xff08;Objectives and Key Results&#xff09;正是这个挑战的解决方案之一。OKR的实施可以帮助开发团队明确目标&#xff0c;关注关键结果&…

powershell几句话设置环境变量

设置环境变量比较繁琐&#xff0c;现在用这段话&#xff0c;在powershell中就可以轻松完成。 $existingPath [Environment]::GetEnvironmentVariable("Path", "Machine") $newPath "C:\Your\Path\Here"if ($existingPath -split ";"…

DSP学习笔记

一个汇编语句包含4个固定顺序的区域&#xff1a;标号&#xff08;必须从第一列开始 不能空格&#xff0c;后面可以有&#xff1a;也可以没有&#xff09; 助记符 操作数 注释&#xff08;用分号或者星号来注释&#xff09;伪指令用.开头&#xff0c;注释可以用第一列开始写&…

软件设计师(五)软件工程基础知识

一、软件工程概述 软件开发和维护过程中所遇到的各种问题称为“软件危机”。 软件工程是指应用计算机科学、数学及管理科学等原理&#xff0c;以工程化的原则和方法来解决软件问题的工程&#xff0c;其目的是提高软件生产率、提高软件质量、降低软件成本。 #mermaid-svg-h3j6K…

大数据指标体系-笔记

指标体系 1 总体流程图 1.1 2 模型‘ 2.1 OSM OSM(Object,Strategy,Measure) 「业务度量」涉及到以下两个概念:一个是KPI ,用来直 接衡量策略的有效性;一个是Target,是预先给出的值,用来判断是否达到预期 2.2 UJM User, Journey, Map 2.3 AARRR-海盗 AARRR(Acquisitio…

【C语言】通讯录3.0 (文件存储版)

前言 通讯录是一种记录联系人信息的工具&#xff0c;包括姓名、电话号码、电子邮件地址、住址等。 文章的一二三章均于上一篇相同&#xff0c;可以直接看第四章改造内容。 此通讯录是基于通讯录2.0&#xff08;动态增长版&#xff09;的基础上进行增加文件操作功能&#xff0c…

【多线程学习6】synchronized关键字

【多线程学习6】synchronized关键字 一、synchronized关键字是什么&#xff1f;有什么作用&#xff1f; synchronized关键字是Java线程同步的关键字&#xff0c;其可以修饰方法或代码块&#xff0c;并可以保证其修饰的方法或代码块在任意时刻只能有一个线程执行。 synchroni…

K8s集群安全机制

1.访问K8s集群的时候&#xff0c;需要经过三个步骤完成具体操作 &#xff08;1&#xff09;认证&#xff08;2&#xff09;鉴权&#xff08;授权&#xff09;&#xff08;3&#xff09;准入控制 进行访问的时候&#xff0c;过程中都要经过apiserver&#xff0c;apiserver做统…

java,python,c++有什么区别,python java c c++区别

大家好&#xff0c;给大家分享一下java,python,c有什么区别&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 从这四种语言的难度、受欢迎度还有作用以及优点缺点给楼主做一个全面的分析&#xff0c;我们可以从中了解其区别&#xff0c;以及…

AP2400 LED汽车摩灯照明电源驱动 过EMC DC-DC降压恒流IC

产品特点 宽输入电压范围&#xff1a;5V&#xff5e;100V 可设定电流范围&#xff1a;10mA&#xff5e;6000mA 固定工作频率&#xff1a;150KHZ 内置抖频电路&#xff0c;降低对其他设备的 EMI干扰 平均电流模式采样&#xff0c;恒流精度更高 0-100%占空比控制&#xff0…

【状态估计】基于UKF法、AUKF法的电力系统三相状态估计研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

并查集练习—省份数量

上一篇中讲了并查集及其原理&#xff0c;在这篇文章中简单应用一下。如果对并查集不是很了解强烈建议先看上一篇。 题目&#xff1a; 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相…

大数据Flink(五十七):Yarn集群环境(生产推荐)

文章目录 Yarn集群环境(生产推荐) 一、准备工作

目标检测中的IOU

IOU 什么是IOU?IOU应用场景写代码调试什么是IOU? 简单来说IOU就是用来度量目标检测中预测框与真实框的重叠程度。在图像分类中,有一个明确的指标准确率来衡量模型分类模型的好坏。其公式为: 这个公式显然不适合在在目标检测中使用。我们知道目标检测中都是用一个矩形框住…