java将doc文件转换为pdf文件的三种方法

http://feifei.im/archives/93

——————————————————————————————————————————————

项目要用到doc转pdf的功能,一番google之后总结出了三种方法(免费方案),于是一一试了一下,做个总结记录,下次要用直接查,省的忘了……

方法1.poi读取doc + itext生成pdf (实现最方便,效果最差,跨平台)

方法2.jodconverter + openOffice (一般格式实现效果还行,复杂格式容易有错位,跨平台)

方法3.jacob + msOfficeWord + SaveAsPDFandXPS (完美保持原doc格式,效率最慢,只能在windows环境下进行)

方法1:使用jdoctopdf来实现,这是一个封装好的包,可以把doc转换成pdf,html,xml等格式,调用很方便
地址:http://www.maxstocker.com/jdoctopdf/downloads.php
需要自己导入poi包与itext包,需要注意的是itext要导入itext-2.1.5版本,新版本由于包名不同,会出错
也可以自己根据网上的其他教程根据需要自己写方法来实现。
用jdoctopdf的实现方法如下:

public void doc2pdf(String docFileName) throws Exception{
        String path =  this.getSession().getServletContext().getRealPath("/")+"attachment/";
        Parser p = new DocParser();// create a new parser instance
        FileInputStream fis = new FileInputStream(path+"/doc/"+ docFileName + ".doc");// creating InputStream for use with parser
        DocumentElement mydoc = p.parse(fis,true,false);// parse document from input stream
        DocWriter w = new PDFWriter();// create PDF writer
        w.writeDocument(mydoc,new FileOutputStream(path+"/pdf/"+docFileName + ".pdf"));// write document as pdf using writer
        w = new XHTMLWriter();
        w.writeDocument(mydoc,new FileOutputStream(path+"/pdf/"+docFileName + ".html"));// write document as xhtml
    }

public String materialUpload(){
        try {
            doc2pdf("ttt");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return SUCCESS;
    }

方法1转化后pdf截图:(itext转中文需要额外配置,所以。。。一片空白,格式也错位了)

方法2:使用jodconverter来调用openOffice的服务来转换,openOffice有个各个平台的版本,所以这种方法跟方法1一样都是跨平台的。
jodconverter的下载地址:http://www.artofsolving.com/opensource/jodconverter
首先要安装openOffice,下载地址:http://www.openoffice.org/download/index.html
安装完后要启动openOffice的服务,具体启动方法请自行google,

mac下的启动方法为终端输入

/Applications/OpenOffice.org.app/Contents/MacOS/soffice "-accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" -nologo -headless

准备工作完成后在项目里导入下载下来的包,然后加个方法就OK:

public void createPdf(String docFileName) throws IOException{
        String path =  this.getSession().getServletContext().getRealPath("/")+"attachment/";
        File inputFile = new File(path+"/doc/"+ docFileName + ".doc");
        File outputFile = new File(path+"/pdf/"+docFileName + ".pdf");

        // connect to an OpenOffice.org instance running on port 8100
        OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
        connection.connect();

        // convert
        DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
        converter.convert(inputFile, outputFile);

        // close the connection
        connection.disconnect();
    }

方法2的截图(格式基本一致,有错位)

方法3:效果最好的一种方法,但是需要window环境,而且速度是最慢的需要安装msofficeWord以及SaveAsPDFandXPS.exe(word的一个插件,用来把word转化为pdf)
Office版本是2007,因为SaveAsPDFandXPS是微软为office2007及以上版本开发的插件
SaveAsPDFandXPS下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=7
jacob 包下载地址:http://sourceforge.net/projects/jacob-project/
我下的是jacob-1.17-M2.zip
下载下来的jacob里的jar包导入到项目里,
jacob的dll文件放到到你的jdk/jre/bin下面(不放会报错:java.lang.NoClassDefFoundError: Could not initialize class com.jacob.com.Dispatch)

网上还有一种是把dll放在放在以下代码输出的路径里的任意一个路径目录

System.getProperty("java.library.path");

这个我没试过,应该也是可以的
然后添加方法:

static final int wdFormatPDF = 17;// PDF 格式
    public void wordToPDF(String docFileName){    

        System.out.println("启动Word...");
        long start = System.currentTimeMillis();
        ActiveXComponent app = null;
        Dispatch doc = null;
        try {
            app = new ActiveXComponent("Word.Application");
            app.setProperty("Visible", new Variant(false));
            Dispatch docs = app.getProperty("Documents").toDispatch();    

            String path =  this.getSession().getServletContext().getRealPath("/")+"attachment/";
            String sfileName = path+"/doc/"+ docFileName + ".doc";
            String toFileName = path+"/pdf/"+ docFileName + ".pdf";

            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();

    }

需要注意的是,如果没有安装SaveAsPDFandXPS.exe的话会提示

========Error:文档转换失败:Invoke of: SaveAs
Source: Microsoft Word
Description:

方法3pdf最终转换效果(格式完全一致):

时间: 2024-10-07 06:13:29

java将doc文件转换为pdf文件的三种方法的相关文章

spring在xml文件中配置bean的三种方法

一.最常见,也是缺省,是调用spring的缺省工厂类 spring缺省工厂类:org.springframework.beans.factory.support.DefaultListableBeanFactory使用其静态方法preInstantiateSingletons() 配置文件中最普通最基本的定义一个普通bean<bean id="DvdTypeDAOBean" class="com.machome.dvd.impl.DvdTypeDAO" >

Java/JSP获得客户端网卡MAC地址的三种方法解析

java/jsp获得客户端(IE)网卡MAC地址的方法大概有三种. 1.通过命令方式,在客户端执行Ipconfig 等等.(java/jsp) 2.通过ActiveX的方法.(jsp) 3.通过向137的端口发送查询指令的方法.(java/jsp) 简介: 第一种方法,在真正用到时候不知道为什么获得mac地址的指令阻塞了,不往下继续执行.而且速度是这三种方法中最慢的一种. 代码如下: String sip=""; String smac=""; sip = requ

Swift中,把NSData转换为Byte数组的三种方法

最近做IOS开发需要从一个NSData中读出数据.但是找不到相关文档.网上搜索也有人问,我看到有Objective-C的答案,但基本上没有Swift的方案. NSData的bytes是UnsafePointer<Void>类型,我不知道怎样直接获取到他的值(如果你知道,请一定要告诉我). 所以我自己摸索了一下把NSData转换为[Byte]的方法,希望起到抛砖引玉的作用. 下面直接在PlayGround中演示: 最后我采用的当然是第三种方法: import Foundation var b:[

QML中文件的加载(三种方法)

在这里小小总结一下QML文件中如何加载QML文件与JavaScript文件. 1.QML文件中加载JavaScript文件 语法: import <ModuleIdentifier> <Version.Number> [as <Qualiflier>] ModuleIdentifier为URL: Version.Number为版本号: Qualifier为自定义命名: 示例代码如下: Qml文件: 图一 Js文件 图二 注:将js文件引入后可直接调用里面的函数,自定义命

.chm 文件转换为 pdf文件

.chm 文件: CHM是英语“Compiled Help Manual”的简写,即“已编译的帮助文件”.CHM是微软新一代的帮助文件格式,利用HTML作源文,把帮助内容以类似数据库的形式编译储存. 2 CHM文件格式是微软1998年推出的基于HTML文件特性的帮助文件系统,以替代早先的WinHelp帮助系统,它在Windows 98中把CHM类型文件称作“已编译的HTML帮助文件”.被IE浏览器支持的JavaScript.VBScript.ActiveX.Java Applet.Flash.常

关于Asp.Net调用Office组件将Word文件转换为Pdf文件

1.首先安装 Microsoft Office 2007加载项:Microsoft Save as PDF-简体中文版:下载地址: http://download.microsoft.com/download/3/8/8/388812b2-0d3f-474e-a7ef-b095d3d0d3cd/SaveAsPDF.exe ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

java中判断字符串是否为数字的三种方法

//    1用JAVA自带的函数    public static boolean isNumericFirst(String str){      for (int i = str.length();--i>=0;){          if (!Character.isDigit(str.charAt(i))){        return false;       }      }      return true;     } //2用正则表达式    public static bo

Java小案例——交换两个数值的三种方法

要求: 互换两个数的值 方法一:借助第三方变量 /** * 借助第三方变量对两个值进行互换 * @author Administration * */ public class ExchangeValue { public static void main(String[] args) { int a = 10; int b = 15; System.out.println("a的值:"+a+",\tb的值:"+b); System.out.println(&quo

java实现map和object互转的三种方法

/** * 使用org.apache.commons.beanutils进行转换 */ class A { public static Object mapToObject(Map<string object=""> map, Class<?> beanClass) throws Exception { if (map == null) return null; Object obj = beanClass.newInstance(); org.apache.c