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文件。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java利用jacob将word转pdf

    本文实例为大家分享了java开发利用jacob将word转pdf的具体代码,供大家参考,具体内容如下 jacob 缺点:需要 window 环境,而且速度是最慢的需要安装 msofficeWord 以及 SaveAsPDFandXPS.exe ( word 的一个插件,用来把 word 转化为 pdf ) 开发流程: SaveAsPDFandXPS 下载地址 jacob 包下载地址: 1.先安装SaveAsPDFandXPS 2.下载 jacob 解压后存放路径: jacob.jar 放在 C:

  • Java创建和填充PDF表单域方法

    表单域,可以按用途分为多种不同的类型,常见的有文本框.多行文本框.密码框.隐藏域.复选框.单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据.下面的示例中,将分享通过Java编程在PDF中添加以及填充表单域的方法.这里填充表单域可分为2种情况,一种是在创建表单域时填充,一种是加载已经创建好表单域的文档进行填充.此外,对于已经创建表单域并填写好的文档,也可以设置只读,防止修改.编辑. 要点概括: 1.创建表单域 2.填充表单域 3.设置表单域只读 工具:Free Spire.PDF for

  • Java实现PDF打印的解决方案

    1.Java Print Service Java Print Service是Java自带的打印框架,所在的包javax.print.PrintService;. 实现PDF打印的代码流程如下 //1.得到一个文件的输入流 FileInputStream fiStream; try { psStream = new FileInputStream("./sample.PDF"); } catch (FileNotFoundException ffne) { } if (psStrea

  • java通过PDF模板填写PDF表单

    本文实例为大家分享了java通过PDF模板填写PDF表单的具体代码,包括图片,供大家参考,具体内容如下 需要用到的java包: itext.jar.iTextAsian.jar的JAR包.这个包里面定义了与中文输出相关的一些文件. 编写的表单如下: import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap;

  • java使用PDFRenderer实现预览PDF功能

    本文实例为大家分享了java使用PDFRenderer实现预览PDF功能,供大家参考,具体内容如下 需要一个jar PDFRenderer-0.9.0.jar package com.wonders.stpt.attach.action; import java.awt.Image; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInp

  • java实现在pdf模板的指定位置插入图片

    本文实例为大家分享了java在pdf模板的指定位置插入图片的具体代码,供大家参考,具体内容如下 java操作pdf有个非常好用的库itextpdf,maven: <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.6</version> </dependency> <!--

  • Java设置PDF有序和无序列表的知识点总结

    文档中的设置有序或无序列表是一种反应内容上下级关系或者内容相同属性的方式,与单纯的文字叙述相比,它能有效增强文档内容的条理性,突出重点.因此,本文将分享通过Java编程在PDF文档中设置有序或无序列表的方法. 使用工具:Free Spire.PDF for Java V2.2.2(免费版) Jar文件导入: Step1:在Java程序中新建一个文件夹可命名为Lib.并将下载包中的jar文件(如下图)复制到新建的文件夹下. Step2:复制文件后,添加到引用类库:选中这个jar文件,点击鼠标右键,

  • 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

  • Java 使用openoffice进行word转换为pdf的方法步骤

    一.下载openoffice第三方工具 建议下载4.1.6版本 http://www.openoffice.org/download/index.html 二.开启openoffice服务 找到openoffice安装目录下OpenOffice 4\program>soffice运行cmd,运行命令soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard 三.Java代

  • java使用jacob.jar将word转pdf

    本文实例为大家分享了java利用jacob.jar将word转pdf的具体代码,供大家参考,具体内容如下 1.jacob.jar配置说明 JACOB 就是 JAVA-COM Bridge的缩写,提供自动化的访问com的功能,使用jacob.jar首先电脑要安装了office. 将jacob.jar jacob.jar导入到项目lib目录使用前,还要然后把jacob.bll放入C:\Windows\System32目录下,同时还要放入java/jdk/jre/bin目录下(选择bll文件的时候,如

  • Java使用jacob将微软office中word、excel、ppt转成pdf

    本文实例为大家分享了Java使用jacob将微软office文档转成pdf的具体代码,供大家参考,具体内容如下 在使用jacb前,我们需要去下载 jacob.jar 和 jacob-1.18-x64.dll 其次,我们需要将jacob-1.18-x64.dll放入到jdk的bin目录下才可以使用 第三,使用jacb之前,我们需要确保office能正常使用 如果你现在使用的是maven工程,那么不好意思,现在还没有发布正式的jacb资源文件,我们需要自定的maven依赖,如下: <dependen

  • Java实现无损Word转PDF的示例代码

    目录 前言 word转pdf实现思路 项目远程仓库 Maven项目pom文件依赖 核心代码实现 结果分析 前言 本来想写word转pdf和pdf转word的代码呢,没想到word转pdf就写了很多很多行代码才实现,为了方便大家消化理解,先写了word转pdf方法实现作为一篇文章. word转pdf实现思路 代码实现主要依赖两个第三方jar包,一个是pdfbox,一个是aspose-words.pdfbox包完全开源免费,aspose-words免费版生成有水印,且生成数量有限制.单纯用pdfbo

  • Linux平台中使用PHP把word转pdf的实现方法

    Linux平台中使用PHP把word转pdf的实现方法 1.ubantu下安装libreoffice sudo apt-get install libreoffice 2.命令行执行word转pdf 将 /home/wordToPdf/wordFiles/目录下的CAS.docx转成pdf存放到 /home/wordToPdf/pdfFiles 目录下: libreoffice --headless --convert-to pdf:writer_pdf_Export /home/wordToP

  • Java使用openOffice对于word的转换及遇到的问题解决

    一:需求详情: OpenOffice.org 是一套跨平台的办公室软件套件,能在 Windows.Linux.MacOS X (X11).和 Solaris 等操作系统上执行.它与各个主要的办公室软件套件兼容.OpenOffice.org 是自由软件,任何人都可以免费下载.使用.及推广它. 公司需要存储合同文件,用户上传word文档的合同,通过openOffice去把word转换为pdf.再把pdf转换为图片格式,并分别存储.因为openOffice的转换需要耗费挺大的内存,所以设计为task任

  • Java 添加超链接到 Word 文档方法详解

    在Word文档中,超链接是指在特定文本或者图片中插入的能跳转到其他位置或网页的链接,它也是我们在编辑制作Word文档时广泛使用到的功能之一.今天这篇文章就将为大家演示如何使用Free Spire.Doc for Java在Word文档中添加文本超链接和图片超链接. Jar包导入 方法一:下载Free Spire.Doc for Java包并解压缩,然后将lib文件夹下的Spire.Doc.jar包作为依赖项导入到Java应用程序中. 方法二:通过Maven仓库安装JAR包,配置pom.xml文件

  • PHP调用OpenOffice实现word转PDF的方法

    最近一直在研究PHP word文档转PDF,也在网上搜索了很多类似的资料,大多数都是通过OpenOffice进行转换的. 核心的代码如下: function MakePropertyValue($name,$value,$osm){ $oStruct = $osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue"); $oStruct->Name = $name; $oStruct->Value = $value

随机推荐