Java通过openOffice实现word,excel,ppt转成pdf实现在线预览
相关博文来源:
简书:java通过openOffice实现word,excel,ppt转成pdf实现在线预览
博客园:java 如何将 word,excel,ppt如何转pdf --openoffice (1)
博客园:Java使用Openoffice将word、ppt转换为PDF
博客园:linux环境下安装 openOffice 并启动服务
OpenOffice.org 是一套跨平台的办公室软件套件,能在 Windows、Linux、MacOS X (X11)、和 Solaris 等操作系统上执行。它与各个主要的办公室软件套件兼容。OpenOffice.org 是自由软件,任何人都可以免费下载、使用、及推广它。
1.1 下载地址
http://www.openoffice.org/
1.2 JodConverter
jodconverter-2.2.2.zip 下载地址:
http://sourceforge.net/projects/jodconverter/files/JODConverter/
下载openOffce软件,安装相应系统版本,这里以windows为例
添加maven依赖:
<dependency>
<groupId>com.artofsolving</groupId>
<artifactId>jodconverter</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.artofsolving.jodconverter</groupId>
<artifactId>jodconverter-core</artifactId>
<version>3.0-beta-4-jahia2</version>
</dependency>
第二个jar包可能有些资源库没有,下载后,直接放在项目中,直接在pom中加载项目内部jar包即可。
<dependency>
<groupId>org.artofsolving.jodconverter</groupId>
<artifactId>jodconverter-core</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/jodconverter-core.jar</systemPath>
</dependency>
1.3 新建实体类PDFDemo
import java.io.File;
import java.net.ConnectException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.artofsolving.jodconverter.OfficeDocumentConverter;
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.StreamOpenOfficeDocumentConverter;
public class PDFDemo {
public static boolean officeToPDF(String sourceFile, String destFile) {
try {
File inputFile = new File(sourceFile);
if (!inputFile.exists()) {
// 找不到源文件, 则返回false
return false;
}
// 如果目标路径不存在, 则新建该路径
File outputFile = new File(destFile);
if (!outputFile.getParentFile().exists()) {
outputFile.getParentFile().mkdirs();
}
//如果目标文件存在,则删除
if (outputFile.exists()) {
outputFile.delete();
}
// DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration();
// OpenOffice安装在本地环境的目录
String officeHome = "D:\\profiles\\openOfice4";
config.setOfficeHome(officeHome);
config.setPortNumber(8100);
config.setTaskExecutionTimeout(1000 * 60 * 5);// 设置任务执行超时为5分钟
config.setTaskQueueTimeout(1000 * 60 * 60 * 24);// 设置任务队列超时为24小时
OfficeManager officeManager = config.buildOfficeManager();
officeManager.start();
OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
if (inputFile.exists()) {
// 进行PDF格式的转换
converter.convert(inputFile, outputFile);
}
officeManager.stop();
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public static void main(String[] args) {
boolean flag = officeToPDF("D:\\testE.xls", "D:\\test3.pdf");
System.out.println(flag);
}
}
上面officceToPDF方法的第一个参数是原文件路径,第二个参数是输出文件路径,后缀名改成html就转成html,后缀名是pdf就转成pdf
上面的方法比较浪费性能 每次都要打开关闭,可以在服务器端开启soffice服务的方式直接调用连接会比较可行;
去到安装目录的program文件夹 cmd打开,运行
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;"-nofirststartwizard
可以上图看到进程已开启
以下代码可调用:
public static boolean officeToPDF(String sourceFilePath, String destFilePath) {
boolean flag = false;
//try {
File inputFile = new File(sourceFilePath);
if (!inputFile.exists()) {
// 找不到源文件, 则返回false
return flag;
}
// 如果目标路径不存在, 则新建该路径
File outputFile = new File(destFilePath);
if (!outputFile.getParentFile().exists()) {
outputFile.getParentFile().mkdirs();
}
// 如果目标文件存在,则删除
if (outputFile.exists()) {
outputFile.delete();
}
// DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
try {
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
connection.connect();
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
if (inputFile.exists()) {
// 进行PDF格式的转换
converter.convert(inputFile, outputFile);
}
connection.disconnect();
flag = true;
} catch (Exception e) {
flag = false;
e.printStackTrace();
}
return flag;
}
二、实践代码二
package indi.johnny.convert;
import java.io.File;
import java.io.FileNotFoundException;
import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager;
//转换文档为pdf
public class OpenOfficePdfConvert {
/**
* @param args
*/
private static OfficeManager officeManager;
private static String OFFICE_HOME = "D:/software/OpenOffice 4/";
private static int port[] = { 8100 };
public void convert2PDF(String inputFile, String outputFile) throws FileNotFoundException {
startService();
System.out.println("进行文档转换转换:" + inputFile + " --> " + outputFile);
OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
converter.convert(new File(inputFile), new File(outputFile));
stopService();
System.out.println();
}
// 打开服务器
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 static void main(String[] args) throws Exception {
String path = "C:/Users/johnny/Desktop/文档/20170420/test/001/";
OpenOfficePdfConvert opc = new OpenOfficePdfConvert();
opc.convert2PDF(path+"1.docx", path+"1.pdf");
}
}
将代码中的 OFFICE_HOME换成自己的openoffice的安装路径,端口8100不用动。
三、linux环境下安装 openOffice 并启动服务- .http://www.openoffice.org/zh-cn/download/ 去官网链接下载linux版本的openOffice 以4.1.5 版本为例。
- 将压缩包上传至服务器上,并进行解压安装。
1 tar -zxvf 对应的压缩包名字
2 cd 进入解压后的 /zh-cn/RPMS
3 yum localinstall *.rpm
4 cd desktop-integration
5 rpm -ivh openoffice4.1.5-redhat-menus-4.1.5-9789.noarch.rpm
默认会安装在/opt目录下。
1 /opt/openoffice4/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard 临时启动
2 nohup /opt/openoffice4/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard & 后台启动
四、Java使用Openoffice将word、ppt转换为PDF
4.1 Word转换
启动OpenOffice的服务
进入openoffice安装目录,通过cmd启动一个soffice服务,启动的命令是
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;"。
如果觉得后台运行OpenOffice服务比较麻烦,可以通过
4.2 运行代码
public class PDFDemo {
public static boolean officeToPDF(String sourceFile, String destFile) {
try {
File inputFile = new File(sourceFile);
if (!inputFile.exists()) {
// 找不到源文件, 则返回false
return false;
}
// 如果目标路径不存在, 则新建该路径
File outputFile = new File(destFile);
if (!outputFile.getParentFile().exists()) {
outputFile.getParentFile().mkdirs();
}
//如果目标文件存在,则删除
if (outputFile.exists()) {
outputFile.delete();
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
OpenOfficeConnection connection = new SocketOpenOfficeConnection("127.0.0.1", 8100);
connection.connect();
//用于测试openOffice连接时间
System.out.println("连接时间:" + df.format(new Date()));
DocumentConverter converter = new StreamOpenOfficeDocumentConverter(
connection);
converter.convert(inputFile, outputFile);
//测试word转PDF的转换时间
System.out.println("转换时间:" + df.format(new Date()));
connection.disconnect();
return true;
} catch (ConnectException e) {
e.printStackTrace();
System.err.println("openOffice连接失败!请检查IP,端口");
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public static void main(String[] args) {
officeToPDF("E:\\test.docx", "E:\\test.pdf");
}
}
4.3 Word、ppt转Html
只需要将后缀名从.pdf改为.html即可。
public static void main(String[] args) {
officeToPDF("E:\\test.docx", "E:\\test.html");
}
4.4 Maven配置
Maven依赖
<dependency>
<groupId>com.artofsolving</groupId>
<artifactId>jodconverter</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>jurt</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>ridl</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>juh</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>unoil</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.4.3</version>
</dependency>
Maven只有 2.2.1版本,2.2.1版本有一个问题,那就是不兼容docx和pptx,如果你们不使用jodconverter-2.2.2 中lib,而想要使用2.2.1版本,需要修改一下 BasicDocumentFormatRegistry 类中的 getFormatByFileExtension方法:
新建包 com.artofsolving.jodconverter
新建类BasicDocumentFormatRegistry,复制下面代码
package com.artofsolving.jodconverter;
/**
* @author 李文浩
* @date 2017/12/25
*/
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class BasicDocumentFormatRegistry implements DocumentFormatRegistry {
private List documentFormats = new ArrayList();
public BasicDocumentFormatRegistry() {
}
public void addDocumentFormat(DocumentFormat documentFormat) {
this.documentFormats.add(documentFormat);
}
protected List getDocumentFormats() {
return this.documentFormats;
}
public DocumentFormat getFormatByFileExtension(String extension) {
if (extension == null) {
return null;
} else {
if (extension.indexOf("doc") >= 0) {
extension = "doc";
}
if (extension.indexOf("ppt") >= 0) {
extension = "ppt";
}
if (extension.indexOf("xls") >= 0) {
extension = "xls";
}
String lowerExtension = extension.toLowerCase();
Iterator it = this.documentFormats.iterator();
DocumentFormat format;
do {
if (!it.hasNext()) {
return null;
}
format = (DocumentFormat)it.next();
} while(!format.getFileExtension().equals(lowerExtension));
return format;
}
}
public DocumentFormat getFormatByMimeType(String mimeType) {
Iterator it = this.documentFormats.iterator();
DocumentFormat format;
do {
if (!it.hasNext()) {
return null;
}
format = (DocumentFormat)it.next();
} while(!format.getMimeType().equals(mimeType));
return format;
}
}
下面是增加的部分,仅仅增加了将docx按照doc的处理方式处理。而2.2.2版本已经默认增加了。
if (extension.indexOf("doc") >= 0) {
extension = "doc";
}
if (extension.indexOf("ppt") >= 0) {
extension = "ppt";
}
if (extension.indexOf("xls") >= 0) {
extension = "xls";
}