使用SaveAsPDFandXPS + jacob实现Java word转pdf-程序员宅基地

技术标签: java及javaweb  

简介

SaveAsPDFandXPS,微软官方提供的插件。必须是windows系统并且安装了office。
在这里插入图片描述

下载和配置

SaveAsPDFandXPS 下载地址 : http://www.microsoft.com/zh-cn/download/details.aspx?id=7
Jacob 的jar包 下载地址 :https://sourceforge.net/projects/jacob-project/
先安装SaveAsPDFandXPS ,安装成功后 , 打开jacob的jar包 ,里面的结构应该是这样的
在这里插入图片描述
把jacob.jar 放到项目下 , 然后 这里注意 把 两个后缀为dll的文件 放到 jre目录bin的里面 必须放进去 不然会报错(java.lang.NoClassDefFoundError)

开发路径

在这里插入图片描述
或者
在这里插入图片描述

Word转PDF代码

package office;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

import java.io.File;

/**
 * @author liuzonghua
 * @Package office
 * @Description:
 * @date 2019/1/31 10:09
 */
public class WordToPDF {


    private static final int wdFormatPDF = 17;// 指定17为转成pdf格式

    public static void main(String[] args) {
        wordToPDF("C:\\Users\\Admin\\Desktop\\2" + ".doc","C:\\Users\\Admin\\Desktop\\2"  + ".pdf");
    }
    

    public static void wordToPDF(String inFilePath, String outFilePath){

        ActiveXComponent app = null;
        Dispatch doc = null;
        try {
            app = new ActiveXComponent("Word.Application");
            app.setProperty("Visible", new Variant(false));
            Dispatch docs = app.getProperty("Documents").toDispatch();

            doc = Dispatch.call(docs,  "Open" , inFilePath).toDispatch();
            File tofile = new File(outFilePath);
            if (tofile.exists()) {
                tofile.delete();
            }
            Dispatch.call(doc,"SaveAs", outFilePath, wdFormatPDF);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            Dispatch.call(doc,"Close",false);
            if (app != null)
                app.invoke("Quit", new Variant[] {});
        }
        //结束后关闭进程
        ComThread.Release();
    }
}

Excel转PDF代码

package office;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

/**
 * @author liuzonghua
 * @Package office
 * @Description:
 * @date 2019/1/31 14:18
 */
public class ExcelToPDF {

    public static void main(String[] args) {
       xlsToPdf("C:\\Users\\Admin\\Desktop\\2017年学生体质健康测试成绩.xls","C:\\Users\\Admin\\Desktop\\3.pdf");
    }

    public static boolean xlsToPdf(String inFilePath, String outFilePath) {
        ComThread.InitSTA(true);
        ActiveXComponent ax = new ActiveXComponent("Excel.Application");
        try {
            ax.setProperty("Visible", new Variant(false));
            ax.setProperty("AutomationSecurity", new Variant(3)); // 禁用宏
            Dispatch excels = ax.getProperty("Workbooks").toDispatch();


            Dispatch excel = Dispatch.invoke(
                    excels,
                    "Open",
                    Dispatch.Method,
                    new Object[] { inFilePath, new Variant(false),
                            new Variant(false) }, new int[9]).toDispatch();
            // 转换格式
            Dispatch.invoke(excel, "ExportAsFixedFormat", Dispatch.Method,
                    new Object[] { new Variant(0), // PDF格式=0
                            outFilePath, new Variant(0) // 0=标准 (生成的PDF图片不会变模糊)
            // 1=最小文件
            // (生成的PDF图片糊的一塌糊涂)
                    }, new int[1]);


            Dispatch.call(excel, "Close", new Variant(false));


            if (ax != null) {
                ax.invoke("Quit", new Variant[] {});
                ax = null;
            }
            ComThread.Release();
            return true;
        } catch (Exception es) {
            return false;
        }
    }
}

注意

如果出现类似:com.jacob.com.ComFailException: Can’t map name to dispid: Close错误
一般情况下是本机设置问题,doc被admin锁定
解决doc被admin锁定方法有多种,可以使用文件另存为解除锁定。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/IManiy/article/details/91401208

智能推荐

CTF基础知识及web_ctf web-程序员宅基地

文章浏览阅读7.3k次,点赞13次,收藏175次。提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录CTF基础知识一、CTF简介二、CTF赛事介绍三、CTF竞赛模式1.解题模式(Jeopardy)2.攻防模式(Attack-Defense)3.混合模式(Mix)四、CTF竞赛内容国内外著名赛事1、国际知名CTF赛事2、国内知名CTF赛事五、如何学习CTF1、分析赛题2、常规操作3、入门知识推荐书籍CTF基础知识一、CTF简介CTF(Capture The Flag)夺旗比赛,在网络安全领域中指的是网络安全技术人员之间进行._ctf web

Udacity Self-Driving Car Simulator Introduction_udacity self driving car sim ros-程序员宅基地

文章浏览阅读725次。Introduction to Udacity Self-Driving Car SimulatorUdacity recently made its self-driving car simulator source code available on their GitHub which was originally built to teach their Self-Drivin..._udacity self driving car sim ros

python res函数_python函数-程序员宅基地

文章浏览阅读6k次。函数定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可函数特性:def my_sum(x,y): #定义函数名res = x+yreturn res #返回函数执行结果c = my_sum(4,5) #结果赋值给c变量print(c)减少重复代码使程序变的可扩展使程序变得易维护函数参数形参即变量名就是函数定义阶段的参数,实参即变量值就是函数调用阶..._python res

java bean 动作标签_<jsp:javabean>动作标签实例-程序员宅基地

文章浏览阅读607次。动作标签实例之后补齐基础知识scope属性 该属性指定了所创建Bean实例的存取范围,省略该属性时的值为page.标识被执行时,首先会在scope属性指定的范围来查找指定的Bean实例,如果该实例已经存在,则引用这个Bean,否则重新创建,并将其存储在scope属性指定的范围内。 scope属性可选值如下page:(当前页面范围) 制定了所创建的Bean实例只能够在当前的JSP文件中使用,包括在通...

Stata字符型与数值型数据的转换——上市公司证券代码字符型与数值型的互换_stata行业代码变成数值型-程序员宅基地

文章浏览阅读2.3w次,点赞6次,收藏55次。实现效果假设000001、000012、000123、002345、600356、600378为某些上市公司证券代码,上市公司实证研究中,常常需要用到上市公司证券代码,将字符型转为数值型比较容易,直接用destring命令即可实现,但是数值型转为字符型并且补齐6位数的命令比较少见。字符型转为数值型destring Stkcd,replace数值型转为字符型tostring Stkc..._stata行业代码变成数值型

shell脚本--定期清理僵尸进程(临时解决方法)_shell脚本执行exit 1 执行后进程变成僵尸进程-程序员宅基地

文章浏览阅读3.5k次,点赞4次,收藏14次。僵尸进程产生原因了解:僵尸进程是指完成执行通过exit系统调用,或运行时发生致命错误或收到终止信号所致,但在操作系统进程表中仍然有一个表项,处于“终止状态”的进程。这发生于子进程需要保留表项以允许其父进程读取子进程的exit status:一旦退出态通过wait系统调用读取,僵尸进程条目就从进程表中删除,这个过程被称为reap。正常情况下,进程直接被其父进程wait并由系统回收,进程长时间保持僵..._shell脚本执行exit 1 执行后进程变成僵尸进程

随便推点

java 两个时间相减_java两个时间相减得到分钟-程序员宅基地

文章浏览阅读5.6k次,点赞3次,收藏4次。废话不多说: DateFormatdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); try { Dated1=df.parse("2018-03-2613:31:40"); Dated2=df.parse("2018-01-0211:30:24");..._java两个时间相减得到分钟

PHP性能优化工具–xhprof安装-程序员宅基地

文章浏览阅读130次。PHP性能优化工具–xhprof安装,这里我先贴出大致的步骤:1.获取xhprof2.编译前预处理3.编译安装4.配置php.ini5.查看运行结果那么下面我们开始安装xhprof工具吧:1.获取xhprof可以输入网址直接下载,或者wget1234#wget http://p..._php 安装xprof

RK3399-android7.1-mipi转lvds_struct video_timing video_1920x1080_60hz-程序员宅基地

文章浏览阅读847次。RK3399-android7.1-mipi转lvds_struct video_timing video_1920x1080_60hz

c语言变量定义正则表达式,C语言中使用正则表达式-程序员宅基地

文章浏览阅读434次。一个正则表达式的教程可以参看(里面有个测试正则表达式的工具)正则表达是用来匹配字符串的好东东。如果用户熟悉Linux下的sed、awk、grep或vi,那么对正则表达式这一概念肯定不会陌生。由于它可以极大地简化处理字符串时的复杂度,因此现 在已经在许多Linux实用工具中得到了应用。千万不要以为正则表达式只是Perl、Python、Bash等脚本语言的专利,作为C语言程序员,用户同 样可以在自己的..._用正则表达定义变量

Ajax的常用技巧(3)---实现自动刷新页面._ajax页面自动刷新-程序员宅基地

文章浏览阅读1.5w次,点赞4次,收藏20次。网页自动刷新功能在web网站上已经屡见不鲜了,如即时新闻信息,股票信息等,都需要不断获取最新信息。在传统的web实现方式中,想要实现类似的效果,必须进行整个页面的刷新,在网络速度受到一定限制的情况下,这种因为一个局部变动而牵动整个页面的处理方式显得有些得不偿失。Ajax技术的出现很好的解决了这个问题,利用Ajax技术可以实现网页的局部刷新,只更新指定的数据,并不更新其他的数据。 现在创建一_ajax页面自动刷新

Chrome 设置使用已安装JRE的方式_chrome jre-程序员宅基地

文章浏览阅读5.5w次。情况描述此状况发生在Chrome 的较旧的版本上:机器已经安装过JRE 或是JDK, 但是每次打开Chrome 浏览器使用Applet时, 会报需要下载JRE的提示信息(最新的JRE1.7)。看上去, Chrome 并没有找到系统已经安装的JRE。相比而言, 对于IE和Firefox 浏览器。我们可以在Java 控制台设置使用的JRE版本和支持的浏览器, 而且我们可以更改浏览器_chrome jre