java如何将word转化为pdf文件

2023-10-27

相信大家对于java应该都不陌生了,毕竟作为一款计算机语言它的使用频率还是非常高的。很多朋友知道java能进行程序编写,今天小编就给大家介绍一下如何使用java里的jacob来进行word转成pdf格式文件的具体操作,有需要的朋友赶紧一起来看看吧!

java如何将word转化为pdf文件
背景:日常开发ERP系统,会有一些工单或者合同之类需要填写打印。我们就会将其word模板来通过系统自动化填写并转换为PDF格式(PDF文件打印可保证文件质量,是一种通用的格式。文件不易去修改,比较稳定)。所以我们将通过jacob来实现这些功能。

准备工作:

1.服务器需要安装office2007,因为我们就是调用这个来实现转换。

2.需要安装插件jacob,安装jacob-1.14.3-x86.dll到jdkjdk1.7.0jrein(你自己电脑安装的jdk)

3.需要使用jacob-1.14.3.jar包

maven代码如下:

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

4.假如通过以上准备工作未成功转换,就下载一个SaveAsPDFandXPS.exe组件(office2007里的)。我就是通过这个组件才完成转换。

5.上面的在系统为windows7中就可以了,假如你的项目需要发布到服务器(服务器系统一般都是windows2008)。则还需要一步。在上面的基础上再安装安装jacob-1.14.3-x64.dll到jdkjdk1.7.0jrein(你自己电脑安装的jdk)中。很多人在win7下都能成功转换,但在win2008就是出问题。我就是通过磨了一天的时间,看了各种日志才发现问题。

一、工具类(OperationIo.java),这里面可以不做任何修改,复制粘贴就可以了。

package com.repair.util.pub;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public class OperationIO {
    
    static final int wdFormatPDF = 17;// PDF 格式   
    /**
     * WORD转换PDF
     * @param sfileName WORD文件存在位置
     * @param toFileName PDF文件存放位置
     */      
    public static void wordToPDF(String sfileName,String toFileName){    
        System.out.println("启动Word...");      
        long start = System.currentTimeMillis();   
        ActiveXComponent app = null;  
        Dispatch doc = null;  
        try {      
            //调用office word
            app = new ActiveXComponent("Word.Application");      
            app.setProperty("Visible", new Variant(false));  
            Dispatch docs = app.getProperty("Documents").toDispatch();    
            doc = Dispatch.call(docs,  "Open" , sfileName).toDispatch();  
            System.out.println("打开文档..." + sfileName);  
            System.out.println("转换文档到PDF..." + toFileName);      
            File tofile = new File(toFileName);      
            if (tofile.exists()) {      
                tofile.delete();      
            }      
            Dispatch.call(doc,      
                          "SaveAs",      
                          toFileName, // FileName      
                          wdFormatPDF);      
            long end = System.currentTimeMillis();      
            System.out.println("转换完成..用时:" + (end - start) + "ms.");  
              
                
        } catch (Exception e) {      
            System.out.println("========Error:文档转换失败:" + e.getMessage());      
        } finally {  
            Dispatch.call(doc,"Close",false);  
            System.out.println("关闭文档");  
            if (app != null)      
                app.invoke("Quit", new Variant[] {});      
            }  
          //如果没有这句话,winword.exe进程将不会关闭  
           ComThread.Release();     
    }  
    
    /**
     * 递归删除目录下的所有文件及子目录下所有文件
     * @param dir 将要删除的文件目录
     * @return boolean Returns "true" if all deletions were successful.
     *                 If a deletion fails, the method stops attempting to
     *                 delete and returns "false".
     */
    public static boolean deleteDir(File dir) {
        if (dir.isDirectory()) {
            String[] children = dir.list();
            for (int i=0; i<children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        // 目录此时为空,可以删除
        return dir.delete();
    }
    /**
     * 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
     * @param imgFilePath 图片地址路径
     */
    public static String GetImageStr(String imgFilePath) {// 
        byte[] data = null;
         
        // 读取图片字节数组
        try {
          InputStream in = new FileInputStream(imgFilePath);
          data = new byte[in.available()];
          in.read(data);
          in.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
         
        // 对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data);// 返回Base64编码过的字节数组字符串
      }
    
    
    /** 
     * 将二进制转换为图片 
     *  
     * @param base64String 
     */  
    public static void base64StringToImage(String base64String,String imageoutpath) {  
        try {  
            BASE64Decoder decoder = new sun.misc.BASE64Decoder(); 
            byte[] bytes1 = decoder.decodeBuffer(base64String);  
            ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);  
            BufferedImage bi1 = ImageIO.read(bais);  
            File w2 = new File(imageoutpath);// 可以是jpg,png,gif格式  
            ImageIO.write(bi1, "jpg", w2);// 不管输出什么格式图片,此处不需改动  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}


二、业务类(PrintWordToPdf.java) ,这里:

package com.hjm.Test;
 
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
 
import com.engineering.pojos.pub.gcRecordArchive;
import com.repair.util.pub.OperationIO;
 
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
 
public class PrintWordToPdf {
 
    public static void main(String[] args) {
        //创建一个Configuration的实例
        Configuration configuration = new Configuration();
        //设置编码
        configuration.setDefaultEncoding("utf-8");
        //创建Map对象,来保存要填写的数据
        Map<String, Object> paraMap = new HashMap<String, Object>();
        //下面这些是我测试的一些数据
        paraMap.put("ReceivingParty", "中国民航");
        
        paraMap.put("PackingListNo", 10087);
        
        paraMap.put("ConNo", 10088);
        
        try {
            //调用模板的文件夹,new File("D:\\测试")是一个绝对路径,你可以自己设置为服务器路径。
            configuration.setDirectoryForTemplateLoading(new File("D:\\测试"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        Template t = null;
        try {
            //获取模板文件
            t = configuration.getTemplate("FMO-08 Packing List.ftl"); // 获取模板文件
        } catch (IOException e) {
            e.printStackTrace();
        }
        //生成一个文件保存的文件夹
        File file =new File("D:\\最终"); 
        //判断文件夹是否存在,存在删除并重创
        if  (!file .exists()  && !file .isDirectory())      
        {       
            file.mkdir();    
        } else   
        {  
            boolean b = OperationIO.deleteDir(file);
            if(b){
                file.mkdir();
            }
        } 
        //填写数据后生成的word文件。
        String outfilepath = "D:/最终\\结果"+".doc";
        File outFile = new File(outfilepath); // 导出文件
        Writer out = null;
        try {
            try {
                out = new BufferedWriter(new OutputStreamWriter(
                        new FileOutputStream(outFile),"utf-8"));
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
        try {
            t.process(paraMap,out); // 将填充数据填入模板文件并输出到目标文件
            out.flush();
            out.close();
            //转换PDF的文件
            OperationIO.wordToPDF(outfilepath,"D:/最终\\结果"+".pdf");
        } catch (TemplateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

总结:通过以上代码,就可以在模板中填写好数据,并将其生成word文件与其pdf文件。

上面给大家介绍的使用jacob实现word转换为pdf格式文件主要还是通过调用模板文件来达成的。文章中都给大家列出了详细的示范代码,大家可以直接将代码填入来进行操作。如果大家对于上述内容还有什么不明白的地方也可以给小编留言,大家一起交流探讨一番。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java如何将word转化为pdf文件 的相关文章

随机推荐

  • Flex 发布模式

    Flex 平台支持范围广泛的发布模式 它们是 1 客户端模式 即应用程序只运行在客户端上而不需要服务器资源 2 使用简单的RPC 访问服务器数据 即使用HTTPService HTTP GET 或POST 请求 和WebService 通过
  • LeetCode——021

    21 Merge Two Sorted Lists My Submissions QuestionEditorial Solution Total Accepted 122136 Total Submissions 345783 Diffi
  • JAVA字符流InputStreamReader读取文本

    二 字符流 1 单个字符读取 public static void main String args try InputStreamReader in new InputStreamReader new FileInputStream D
  • 简体ProDAD Mercalli SAL 6.0全网唯一系统讲解课中文教程

    ProDAD Mercalli SAL 镜头抖动处理软件 是一个视频防抖插件 可以固定拍摄时的图像抖动 消除摄像机拍摄视频时抖动 颠簸和颤抖的影响 提高画面质量 是进行后期摄影图像编辑必不可少的插件之一 虽然ProDAD Mercalli
  • 小学生机器人编程知识

    小学生机器人编程知识 现在的家长在培养孩子的学习方面也是非常的认真的 会给孩子选择一些能够有利于孩子成长的课程 就拿现在很多的家长给孩子选择少儿编程的课程来说 他们想要孩子去学习机器人编程的课程 但是他们对于小学生机器人编程知识并不是很清楚
  • windows下设置redis服务开机后自动启动

    1 配置环境变量 在path配置环境变量 2 在redis安装目录下打开cmd 输入如下代码 redis server exe service install redis windows conf loglevel verbose 3 这样
  • MAC下搭建Android Studio

    JDK1 8安装 1 到 http www oracle com technetwork java javase downloads jdk8 downloads 2133151 html 下载jdk8 2 双击安装 3 安装完成 在命令行
  • 7-13 日K蜡烛图 (15分)

    7 13 日K蜡烛图 15分 股票价格涨跌趋势 常用蜡烛图技术中的K线图来表示 分为按日的日K线 按周的周K线 按月的月K线等 以日K线为例 每天股票价格从开盘到收盘走完一天 对应一根蜡烛小图 要表示四个价格 开盘价格Open 早上刚刚开始
  • Java复习-20-接口(1)

    接口的定义及使用 如果相对外部隐藏全部的实现细节 就要通过接口来实现 接口的定义 使用interface关键字来定义 由于接口描述的是一个公共的定义标准 所以在接口之中所有的抽象方法的访问权限都为public interface IMess
  • 数据库种类有什么?三种不同数据库介绍

    一 数据库种类有哪些 早期较为时兴的数据库种类有三种 分别是层次式数据库 网络式数据库和关系型数据库 而在如今的互联网中 最常见的数据库种类主要有2种 即关系型数据库和非关系型数据库 二 层次数据库介绍 层次数据库是最开始研制的数据库系统软
  • python获取时间前一天

    可以使用 Python 的 datetime 模块来获取时间前一天的日期 首先 需要导入 datetime 模块 import datetime 然后 可以使用 datetime 模块中的 datetime datetime now 函数获
  • GET、POST、PUT、DELETE等用法

    1 向服务器请求数据 GET get请求是用来获取数据的 只是用来查询数据 不对服务器的数据做任何的修改 新增 删除等操作 get请求会把请求的参数附加在URL后面 2 提交资源到服务器 post post请求一般是对服务器的数据做改变 常
  • so部标协议模拟服务器,808部标协议

    满意答案 豆 浆 2016 10 12 采纳率 58 等级 25 已帮助 62843人 基于部标JT T 808协议及数据格式的GPS服务器 2011年5月10日中国交通通信信息中心下发了 印发道路运输车辆卫星定位系统平台和道路运输车辆卫星
  • python 43行 写一个天气查询爬虫+GUI图形界面化

    这个爬虫爬的是 墨迹天气 https tianqi moji com weather china henan xinxiang 分析了一下这个网址 不同城市的网址就后边的的拼音不同 这时候就只需拼接用户输入的网址就可得到要查询的网址 然后通
  • Putty基础教程之(一).入门命令学习及编写HTML

    这篇文章主要介绍Putty的基础用法 同时通过Putty来编辑HTML文件 一方面是自己最近学习的在线笔记 另一方面希望文章对你有所帮助 Putty是Windows下操作Linux命令的小工具 也是一个跨平台的远程登陆工具 非常好用 常见命
  • 【IT之路】MyEclipse部署java web项目到Tomcat

    1 Java web 项目部署发布到tomcat 2 启动tomcat
  • 测试分布式系统的线性一致性

    测试分布式系统的线性一致性 一 介绍 正确实现一个分布式系统是非常有挑战的一件事情 因为需要很好的处理并发和失败这些问题 网络包可能被延迟 重复 乱序或者丢弃 机器可能在任何时候宕机 即使一些设计被论文证明是正确的 也仍然很难再实现中避免
  • css3弹性盒子模型(Flex)

    css3弹性盒子模型 CSS3 弹性盒子 Flex Box 设置弹性盒子 容器的属性 设置主轴方向 flex direction 设置主轴方向上对齐方式 justify content 设置副轴方向上的对齐方式 align items 设置
  • flutter 组件 Stepper,Step,Padding,Align,Center,FittedBox,AspectRatio,ConstrainedBox

    1 Stepper Step Stepper Key key required this steps step类型的子集 this physics this type StepperType vertical 方向 this current
  • java如何将word转化为pdf文件

    相信大家对于java应该都不陌生了 毕竟作为一款计算机语言它的使用频率还是非常高的 很多朋友知道java能进行程序编写 今天小编就给大家介绍一下如何使用java里的jacob来进行word转成pdf格式文件的具体操作 有需要的朋友赶紧一起来