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

本文从一个只会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 connectionif (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); // 设置转换端口,默认为8100configuration.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。

Office文档转换成PDF文档相关推荐

  1. python学习之word文档转换成pdf文档

    平时办公的时候总有word文档转换pdf的操作,关键wps等转换工具都还是收费的.这里利用python代码把多个word文档转换合并成pdf文档的实现.代码运行需要几个必要库,没有下载安装的小伙伴可以 ...

  2. word转图片 java_Java 利用LibreOffice将Office文档转换成 PDF,进而转图片,实现在线预览功能...

    项目中需要将 Office 文档上传并实现在线预览,用到了 LibreOffice 将 Office 文档转换为 PDF 文档,然后再用 pdfbox 将 PDF 转为图片. 本文介绍借助 Libre ...

  3. Office文档转换成PDF

    分享知识 传递快乐 Office文档转换成PDF 文档转换的方式有很多种,比如有Apache下的POI.jodconverter等技术.本例用的jodconverter-core-3.0技术对文档进行 ...

  4. jpg怎么转换成pdf文档

    JPG转换成PDF?JPG怎么转换成PDF文档?我们知道大部分的PDF格式的文档都不具有编辑功能,用户只能通过手写将PDF内容录入到Word文档中,但是遇到需要将JPG图片转换成PDF,该怎么办呢?下 ...

  5. 用什么方法可以将Word转换成PDF文档?

    我们有时编辑完Word文件需要打印或发送给他人查看,一般会先转换为PDF格式,这样在别的电脑上打开时就不会出现格式的变动,也不会出现因为版本而无法打开的问题,那么用什么方法可以将Word转换成PDF文 ...

  6. WORD文档转换成PDF格式

    由于一个客户的项目中需要将WORD文档转换成PDF格式,实战教程如下: 需求分析:客户的项目以B/S结构为主,提供一个WORD文件在后台自动转换成PDF,经过实际 测试, 如果该篇WORD文档有100 ...

  7. doPDF虚拟打印机-把任何文档转换成pdf的利器

    doPDF是一个完全免费的软件,安装完成之后,它会化身为系统中的虚拟打印机.不管是什么格式的文档还是图片,只要能够被打印,就可以轻松被转换成pdf文档,从此扫描仪的使用频率会大大降低,除了节省之间之外 ...

  8. word怎么转换成pdf文档——两种转换方法分享

    当大家碰到Word转PDF问题的时候,第一反应应该就是百度找方法,但是网上关于这类问题的解决方法五花八门,推荐的软件也是中用和不中用的都有,根本无从下手,那么,面对如何将word转换成pdf文档的问题 ...

  9. 多个jpg图片怎么转换成pdf文档

    对于要处理各种文档的人经常需要使用多个不同类型的文档,却发现文档格式间并没有通用功能,最常见的就是将多个JPG图片转换成PDF文档格式,如果选择手工复制无疑会花费很多时间,如果选择普通的JPG转换工具 ...

最新文章

  1. Yann LeCun最新文章:自监督学习的统一框架
  2. access 处理多少数据_access和excel的区别
  3. pyhton3 适配器模式编写
  4. php laravel组件,php – 在Laravel中为共享组件包中的文件配置
  5. Perl 教学 Perl5中的引用(指针)
  6. Hbase 02_伪分布式、完全分布式
  7. 单片机oled显示浮点数函数_问中文编程在单片机上实现一个电子时钟,总共有几步?...
  8. 怎样更改计算机ip,怎么快速修改电脑ip地址
  9. 《遥感原理与应用》总结—遥感平台
  10. GMA Round 1 YGGDRASIL
  11. Android 使用 7z 压缩字符串(工作总结)
  12. 模拟开关74hc4052的介绍和使用
  13. 为什么PDF转成Word后是图片,怎么才能修改?
  14. OpenWrt软路由安装可道云
  15. 炬源繁荣气化炉炸酱面
  16. 网络 启动计算机,电脑设置网卡启动方法步骤
  17. springboot银行客户管理系统毕业设计源码250903
  18. 在 OneNote 2010中输入复杂的数学公式
  19. 编译sakai10.6
  20. JAVA生成二维码-zxing

热门文章

  1. 为什么用手机USB共享网络,WIN10就变得异常卡顿?
  2. 模糊相似矩阵_主要代码实现
  3. numpy求模/绝对值函数absolute
  4. MBED OS 参考手册-边读边翻译,
  5. C-07 求奇数乘积
  6. 河北新华计算机学校贴吧,读石家庄新华电脑学校“骗人黑幕”的幕后黑手???...
  7. 【滤波器】1. 一阶RC滤波器
  8. 炫!迪奥元宇宙首展、著名建筑师马岩松元宇宙首作落地百度希壤
  9. Objective-C block详解及回调
  10. 中级微观经济学:Chap 5 选择