java使用jacob实现word转pdf

作者:房产二公子 时间:2023-05-12 11:45:33 

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

准备工作:

1.服务器需要安装office2007,因为我们就是调用这个来实现转换。
2.需要安装插件jacob,安装jacob-1.14.3-x86.dll到jdk\jdk1.7.0\jre\bin(你自己电脑安装的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到jdk\jdk1.7.0\jre\bin(你自己电脑安装的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文件。

来源:https://blog.csdn.net/qq_31170429/article/details/78424973

标签:java,jacob,word,pdf
0
投稿

猜你喜欢

  • Android 读取资源文件实例详解

    2022-08-28 13:31:17
  • 学习C#静态函数及变量的一个精典例子与代码

    2021-10-08 18:53:52
  • SpringMVC中转发与重定向的区别浅析

    2023-10-15 23:13:36
  • Java实现酒店客房管理系统

    2023-11-21 06:58:38
  • java安全编码指南之:Number操作详解

    2021-09-27 07:14:50
  • Unity3D网格功能生成球体网格模型

    2021-08-01 01:21:47
  • MyBatis中map的应用与模糊查询实现代码

    2021-09-02 18:27:14
  • java实现大文件分割与合并的实例代码

    2023-11-11 04:31:21
  • java随机生成8位数授权码的实例

    2022-04-24 12:03:47
  • Java链表中元素删除的实现方法详解【只删除一个元素情况】

    2023-01-16 11:49:41
  • Android用户输入自动提示控件AutoCompleteTextView使用方法

    2022-02-25 14:59:50
  • RecyclerView实现拖拽排序效果

    2022-09-14 01:23:40
  • Android实现高亮搜索功能的示例

    2021-06-13 19:25:02
  • 浅析JDK和Tomcat的安装与配置方法

    2022-02-02 07:49:43
  • Android WindowManger的层级分析详解

    2023-08-05 23:51:40
  • 解决Java提示正在尝试分配更低的访问权限问题

    2023-11-04 09:31:08
  • 学习Java之如何正确地跳出循环结构

    2021-10-21 11:21:53
  • 基于servlet实现统计网页访问次数

    2021-11-05 08:35:13
  • spring mvc利用ajax向controller传递对象的方法示例

    2022-10-22 15:06:13
  • C#设计模式之建造者模式生成器模式示例详解

    2021-12-11 05:50:57
  • asp之家 软件编程 m.aspxhome.com