评论

收藏

[Java] java使用jacob实现word转pdf

编程语言 编程语言 发布于:2021-10-06 14:36 | 阅读数:304 | 评论:0

这篇文章主要为大家详细介绍了java使用jacob实现word转pdf,通过调用模板文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
背景:日常开发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文件。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持CodeAE代码之家
原文链接:https://blog.csdn.net/qq_31170429/article/details/78424973

关注下面的标签,发现更多相似文章