一聚教程网:一个值得你收藏的教程网站

热门教程

java使用jacob实现word转pdf的教程

时间:2022-11-14 23:26:46 编辑:袖梨 来源:一聚教程网

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

准备工作:

1.服务器需要安装office2007,因为我们就是调用这个来实现转换。
2.需要安装插件jacob,安装jacob-1.14.3-x86.dll到jdkjdk1.7.0jrebin(你自己电脑安装的jdk)
3.需要使用jacob-1.14.3.jar包
maven代码如下:


  net.sf.jacob-project
  jacob
  1.14.3

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

5.上面的在系统为windows7中就可以了,假如你的项目需要发布到服务器(服务器系统一般都是windows2008)。则还需要一步。在上面的基础上再安装安装jacob-1.14.3-x64.dll到jdkjdk1.7.0jrebin(你自己电脑安装的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

二、业务类(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 paraMap = new HashMap();
 //下面这些是我测试的一些数据
 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文件。

热门栏目