win7 ,java8 ,openoffice.org4
使用apache开源的openoffice软件, 将word,ppt,转存为pdf
最近寻找将常用的word,ppt转换成pdf,和将excel转换成html的方案,看到一篇文章
Office在线预览及PDF在线预览的实现方式大集:
合http://www.officeweb365.com/officetoview.html
尝试过jacob, 但是跨平台性太差劲 ,且换个机器还需要调试, 甚是麻烦
于是决定采用 openoffice 方案
官网地址: http://www.openoffice.org/download/index.html
下载完毕, 一直下一步即可 ,安装完毕后 ,双击打开运行openoffice程序,
然后进入到软件家目录 (C:\Program Files (x86)\OpenOffice 4\program)
打开命令行,运行一下代码 ,开启服务
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
运行完毕,可以看到任务管理器>进程>中出现了soffice.bin 和 soffice.exe ,至此,环境安装和准备工作完成, 接下来就是写代码了
<dependency>
<groupId>com.artofsolvinggroupId>
<artifactId>jodconverterartifactId>
<version>2.2.2version>
dependency>
<dependency>
<groupId>com.github.livesensegroupId>
<artifactId>jodconverter-coreartifactId>
<version>1.0.5version>
dependency>
com.github.livesense ,使用这个包是可以省去在引入其他依赖包,省事 ,不一定必须非用这个, 但是jodconverter-2.2.2是必须的 ,只有2.2.2版本支持07以上的格式 ,需要去官网https://sourceforge.net/projects/jodconverter/files/下载 ,maven仓库只有2.2.1的版本 ,下载完毕自行处理和引入
// 核心代码很简洁,无非就是: 连接 -> 转存为其他格式 -> 断开
OpenOfficeConnection connection = new SocketOpenOfficeConnection(HOST, PORT);
connection.connect();
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
// 可以直接输入文件名实现转存 ,converter会自行判断格式
converter.convert("d://a.docx", "d://aaaaa.pdf");
connection.disconnect();
import com.artofsolving.jodconverter.BasicDocumentFormatRegistry;
import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.DocumentFormat;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
import com.sun.istack.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.validation.constraints.NotNull;
import java.io.File;
import java.net.ConnectException;
public class OpenOfficeUtil {
private static final String HOST = "127.0.0.1";
private static final int PORT = 8100;
/**
* convert("原文件路径","docx", "目标文件路径", "pdf")
*
* @param sourceFile
* @param sourceExtension
* @param targetFile
* @param targetExtension
*/
public static boolean convert(@NotNull String sourceFile, @NotNull String sourceExtension, @NotNull String targetFile, @Nullable String targetExtension) {
// 源文件是否存在
File inputFile = new File(sourceFile);
if (!inputFile.exists()) {
logger.error("源文件不存在:{} " + sourceFile);
return false;
}
if (!inputFile.canRead()) {
logger.error("源文件存在, 但是不可读:{} " + sourceFile);
return false;
}
// 输出文件的父目录创建.
File outputFile = new File(targetFile);
File targetParentFolders = outputFile.getParentFile();
if (!targetParentFolders.exists()) {
//noinspection ResultOfMethodCallIgnored
targetParentFolders.mkdirs();
}
// 连接, 转换, 然后关闭
OpenOfficeConnection connection = new SocketOpenOfficeConnection(HOST, PORT);
try {
if (!connection.isConnected()) {
connection.connect();
}
} catch (ConnectException e) {
e.printStackTrace();
logger.error("严重错误: openoffice 服务连接失败." + HOST + ":" + PORT);
return false;
}
boolean isSuccess;
try {
//源文件类型 @see document-formats.xml
DefaultDocumentFormatRegistry ddfr = new DefaultDocumentFormatRegistry();
DocumentFormat sourceDF = ddfr.getFormatByFileExtension(sourceExtension);
DocumentFormat targetDF = ddfr.getFormatByFileExtension(targetExtension);
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(inputFile, sourceDF, outputFile, targetDF);
isSuccess = true;
} catch (Exception e) {
e.printStackTrace();
logger.error("严重错误: 文件转换失败:{}" + e.getMessage());
isSuccess = false;
} finally {
if (connection.isConnected()) {
connection.disconnect();
}
}
return isSuccess;
}
public static void main(String[] args) {
convert("d://a.docx", "docx", "d://aa.pdf", "pdf");
convert("d://a.pptx", "pptx", "d://aa.pdf", "pdf");
convert("d://a.xlsx", "xlsx", "d://aa.html", "html");//巨丑
}
}
java代码部分写的太多了, 其核心部分就几句, 自行体会:
OpenOfficeConnection connection = new SocketOpenOfficeConnection(HOST, PORT);
connection.connect();
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert("d://a.docx", "d://aaaaa.pdf");
connection.disconnect();
其中 ,DefaultDocumentFormatRegistry 是为了应对文件没有后缀(例如d://a), 而指定文件类型而做的操作 ,可以看看 OpenOfficeDocumentConverter 源码 ,里面有多个重载的convert方法