Office文档转换成PDF文档

本方案是我在网络上收集前人智慧,以及辛苦奋斗探索几周完成的成果。

本文从一个只会Java零基础的开发者的角度,全面、琐碎的进行总结。


具体方案:

方案一、使用OpenOffice.org的系统服务+jodconverter插件 将office文档转换为pdf:

OpenOffice.org 是一套跨平台的办公室软件套件,能在 Windows、Linux、MacOS X (X11)、和 Solaris 等操作系统上执行。它与各个主要的办公室软件套件兼容。OpenOffice.org 是自由软件,任何人都可以免费下载、使用、及推广它。

OpenOffice org 的 API 以 UNO (UniversalNetwork Object) 写成,所以本身是电脑语言中立的。现在来说,OpenOffice org主要是以 C++ 撰写的,但也能以 Java(TM) 来撰写。

1. 需要用的软件

    OpenOffice 下载地址http://www.openoffice.org/

    JodConverter 下载地址http://sourceforge.net/projects/jodconverter/files/JODConverter/,也可以直接从附件里面下载

2.启动OpenOffice的服务

    利用OpenOffice进行转码的时候,都是需要先用cmd启动一个soffice服务,启动的命令是:soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;"。

    实际上,在我的项目中,进行转码只是偶尔进行,然而当OpenOffice的转码服务启动以后,该进程(进程名称是soffice.exe)会一直存在,占用系统资源。可以将执行该服务的命令直接在JAVA代码里面调用,然后当转码完成的时候,直接干掉这个进程。

3.将JodConverter相关的jar包添加到项目中

    将JodConverter解压缩以后,把lib下面的jar包全部添加到项目中,还需要将jodconverter-core-3.0-beta-4.jar包加载到项目中


下面是Java代码:


package com.warshaw.util;

import java.io.File;
import java.net.ConnectException;
import java.util.Date;

import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager;

import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;

public class DOC2PDFUtil extends java.lang.Thread {
	private File inputFile;// 需要转换的文件
	private File outputFile;// 输出的文件
	
	private static OfficeManager officeManager;
	private static String OFFICE_HOME = "C:\\Program Files (x86)\\OpenOffice 4";//OpenOffice安装目录
	private static int port[] = { 8100 };

	public DOC2PDFUtil(File inputFile, File outputFile) {
		this.inputFile = inputFile;
		this.outputFile = outputFile;
	}

	public void docToPdf() {
		Date start = new Date();
		
		OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
		try {
			startService();
			connection.connect();
			DocumentConverter converter = new OpenOfficeDocumentConverter(
					connection);
			converter.convert(inputFile, outputFile);
			stopService();
		} catch (ConnectException cex) {
			cex.printStackTrace();
		} finally {
			// close the connection
			if (connection != null) {
				connection.disconnect();
				connection = null;
			}
		}
	}

	// 打开服务器
	public static void startService() {
		DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration();
		try {
			System.out.println("准备启动服务....");
			configuration.setOfficeHome(OFFICE_HOME);// 设置OpenOffice.org安装目录
			configuration.setPortNumbers(port); // 设置转换端口,默认为8100
			configuration.setTaskExecutionTimeout(1000 * 60 * 5L);// 设置任务执行超时为5分钟
			configuration.setTaskQueueTimeout(1000 * 60 * 60 * 24L);// 设置任务队列超时为24小时

			officeManager = configuration.buildOfficeManager();
			officeManager.start(); // 启动服务
			System.out.println("office转换服务启动成功!");
		} catch (Exception ce) {
			System.out.println("office转换服务启动失败!详细信息:" + ce);
		}
	}

	// 关闭服务器
	public static void stopService() {
		System.out.println("关闭office转换服务....");
		if (officeManager != null) {
			officeManager.stop();
		}
		System.out.println("关闭office转换成功!");
	}

	/**
	 * 由于服务是线程不安全的,所以……需要启动线程
	 */
	public void run() {
		this.docToPdf();
	}

	public File getInputFile() {
		return inputFile;
	}

	public void setInputFile(File inputFile) {
		this.inputFile = inputFile;
	}

	public File getOutputFile() {
		return outputFile;
	}

	public void setOutputFile(File outputFile) {
		this.outputFile = outputFile;
	}

	/**
	 * 测试main方法
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		File inputFile = new File("e://xheditor的使用.doc");
		File outputFile = new File("e://xheditor的使用.pdf");
		DOC2PDFUtil dp = new DOC2PDFUtil(inputFile, outputFile);
		dp.start();
	}
}

方案二、使用jacob插件 将office文档转换为pdf:

1、下载jacob的最新版本,并导入到项目的运行环境中中(注意jar包和.dll文件的存放目录,不然会导致程序运行出错)

下载地址:http://sourceforge.net/projects/jacob-project/

将jar放到jdk下的jre的ext目录下:C:\Program Files\Java\jdk1.7.0_21\jre\lib\ext\(这是我的jdk安装目录)

将*.dll(有两个,一个是x_86的,一个是x_64的,根据当前系统选择。我的系统是win7 64位 旗舰版)放到jdk下的jre的bin目录下:C:\Program Files\Java\jdk1.7.0_21\jre\bin


下面是Java代码:

package com.warshaw.util;

import java.io.File;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public class Office2PdfUtil {
	
	private String outputpath;//设置输出路径
	
	static final int wdFormatPDF = 17;// PDF 格式
	
	private ActiveXComponent app = null;
	private Dispatch doc = null;

	/**
	 * 文件转换方法
	 * @author warshaw
	 * @dataTime: 2014-10-30 下午4:17:35
	 * @param inpath-指定被转换文件的完整路径
	 */
	public void fileConverter(String inpath) {
		// 根据路径创建文件对象
		File file = new File(inpath);
		System.out.println("文件路径: " + file.getPath());

		// 获取文件名(包含扩展名)
		String fileName = file.getName();
		System.out.println("文件名称: " + file.getName());
		
		// 过滤掉文件名中的扩展名
		int filenamelength = fileName.length();
		System.out.println("文件名长度: " + filenamelength);
		int dotposition = fileName.lastIndexOf(".");
		fileName = fileName.substring(0, dotposition);
		
		// 设置输出路径,一定要包含输出文件名(不含输出文件的扩展名)
//		String outpath = System.getProperty("java.io.tmpdir");//设置输出路径为系统临时文件夹路径
		String outpath = System.getenv("temp");//设置输出路径为系统临时文件夹路径
		System.out.println("输出路径为系统临时文件夹路径: " + outpath);
		
		outpath = new String(outpath + "\\" + fileName);
		System.out.println(outpath);
		
		try {
			// 启动Word程序
			app = new ActiveXComponent("Word.Application");
			
			// 接收输入文件和输出文件的路径
			String inFile = inpath;
			setOutputpath(outpath + ".pdf");
			System.out.println("======="+outputpath);
			
			String tpFile = outputpath;
			// 设置word不可见
			app.setProperty("Visible", new Variant(false));
			Dispatch docs = app.getProperty("Documents").toDispatch();
			// 打开输入的doc文档
			doc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[] { inFile, new Variant(false), new Variant(true) }, new int[1]).toDispatch();

			// 另存文件, 其中Variant(n)参数指定另存为的文件类型
			Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] { tpFile, new Variant(wdFormatPDF) }, new int[1]);

			System.out.println("转换完毕。");
		} catch (Exception e) {
			System.out.println("========Error:文档转换失败:" + e.getMessage());
		} finally {
			Variant f = new Variant(false);
			// 关闭并退出
			Dispatch.call(doc, "Close", f);
			if (app != null) {
				app.invoke("Quit", new Variant[] {});
			}
		}
		ComThread.Release();// 关闭winword.exe进程

	}

	public String getOutputpath() {
		return outputpath;
	}

	public void setOutputpath(String outputpath) {
		this.outputpath = outputpath;
	}
	
	public static void main(String[] args) {
		Office2PdfUtil o2p = new Office2PdfUtil();
		String inpath = new String("e://xheditor的使用.doc");
		
		o2p.fileConverter(inpath);
	}

}

/*
 * 其中第65行中的 invoke()函数中的Variant(n)参数指定另存为的文件类型(n的取值范围是0-25),他们分别是:
 * Variant(0):doc
 * Variant(1):dot
 * Variant(2-5),Variant(7):txt
 * Variant(6):rft
 * Variant(8),Variant(10):htm
 * Variant(9):mht
 * Variant(11),Variant(19-22):xml
 * Variant(12):docx
 * Variant(13):docm
 * Variant(14):dotx
 * Variant(15):dotm
 * Variant(16)、Variant(24):docx
 * Variant(17):pdf
 * Variant(18):xps
 * Variant(23):odt
 * Variant(25):与Office2003与2007的转换程序相关,执行本程序后弹出一个警告框说是需要更高版本的 Microsoft Works
 * Converter由于我计算机上没有安装这个转换器,所以不清楚此参数代表什么格式
 * 
 */

我的office版本是2010的,如果是2007的版本,还需要安装一个office的兼容包SaveASPDFandXPS.exe。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值