package com.artfess.file.util;
import com.artfess.base.exception.BaseException;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;
import org.apache.commons.io.FilenameUtils;
import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.jodconverter.DocumentConverter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.File;
import java.net.ConnectException;
/**
* office文档转换为pdf
* 注意事项:1、openoffice在linux安装卸载,由于一开始openoffice装的版本不太对,后面想卸载发现怎么都卸载不干净,
* 这里提供一个完全卸载的命令rpm -e `rpm -qa |grep openoffice` `rpm -qa |grep ooobasis`
* 2、本地调用openoffice转pdf正常,部署到服务器文件乱码。这是由于linux缺少windows环境下中文字体库,通过将C:\Windows\Fonts文件夹下字体,
* 上传到/usr/share/fonts文件夹下,再通过fc-cache -fv命令更新字体缓存,然后重启openoffice即可解决
*
* @author heyifan
* @company 阿特菲斯信息技术有限公司
* @email heyf@jee-soft.cn
* @date 2018年9月30日
*/
@Component
public class OfficeToPdf {
@Value("${file.office.ip-addr}")
String ipAddr;
@Value("${file.office.port:9093}")
Integer port;
@Resource
ConverterUtils converterUtils;
/**
* 使Office2003-2007全部格式的文档(.doc|.docx|.xls|.xlsx|.ppt|.pptx) 转化为pdf文件
*
* @param inputFilePath 源文件路径,如:"e:/test.docx"
* @param outputFilePath 目标文件路径,如:"e:/test_docx.pdf"
* @return
*/
public boolean openOfficeToPDF(String inputFilePath, String outputFilePath) {
return office2pdf(inputFilePath, outputFilePath);
}
/**
* 使Office2003-2007全部格式的文档(.doc|.docx|.xls|.xlsx|.ppt|.pptx) 转化为pdf文件
*
* @param inputFilePath 源文件路径,如:"e:/test.docx"
* @param outputFilePath 目标文件路径,如:"e:/test_docx.pdf"
* @param remoteStatus 是否使用远程连接openoffice
* @return
*/
public boolean openOfficeToPDF(String inputFilePath, String outputFilePath, boolean remoteStatus) {
if(remoteStatus) {
return office2pdf(inputFilePath, outputFilePath);
}else{
return localOffice2pdf(inputFilePath, outputFilePath);
}
}
/**
* 转换文件
*
* @param inputFile
* @param outputFilePath_end
* @param inputFilePath
* @param outputFilePath
*/
public void converterFile(File inputFile, String outputFilePath_end, String inputFilePath, String outputFilePath) {
File outputFile = new File(outputFilePath_end);
// 假如目标路径不存在,则新建该路径
if (!outputFile.exists()) {
outputFile.getParentFile().mkdirs();
}
try {
//文件转化
SocketOpenOfficeConnection connection = new SocketOpenOfficeConnection(ipAddr, port);
connection.connect();
StreamOpenOfficeDocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection);
converter.convert(inputFile, outputFile);
} catch (ConnectException e) {
throw new BaseException("未找到服务端的附件预览组件.", e);
}
}
/**
* 使Office2003-2007全部格式的文档(.doc|.docx|.xls|.xlsx|.ppt|.pptx) 转化为pdf文件
*
* @param inputFilePath 源文件路径,如:"e:/test.docx"
* @param outputFilePath 目标文件路径,如:"e:/test_docx.pdf"
* @return
*/
public boolean office2pdf(String inputFilePath, String outputFilePath) {
boolean flag = false;
if (null != inputFilePath) {
File inputFile = new File(inputFilePath);
// 判断目标文件路径是否为空
if (null == outputFilePath) {
// 转换后的文件路径
String outputFilePath_end = getOutputFilePath(inputFilePath);
if (inputFile.exists()) {// 找不到源文件, 则返回
converterFile(inputFile, outputFilePath_end, inputFilePath, outputFilePath);
flag = true;
}
} else {
if (inputFile.exists()) {// 找不到源文件, 则返回
converterFile(inputFile, outputFilePath, inputFilePath, outputFilePath);
flag = true;
}
}
} else {
flag = false;
}
return flag;
}
/**
* 转换文件
*
* @param inputFile
* @param outputFilePath_end
* @param inputFilePath
* @param outputFilePath
* @param converter
*/
public static void converterFile(File inputFile, String outputFilePath_end,
String inputFilePath, String outputFilePath,
OfficeDocumentConverter converter) {
File outputFile = new File(outputFilePath_end);
// 假如目标路径不存在,则新建该路径
if (!outputFile.exists()) {
outputFile.getParentFile().mkdirs();
}
@SuppressWarnings("unused")
String outputExtension = FilenameUtils.getExtension(outputFile.getName());
try {
converter.convert(inputFile, outputFile);
}
catch(NullPointerException e) {
throw new BaseException("未找到服务端的附件预览组件.",e);
}
}
/**
* 使Office2003-2007全部格式的文档(.doc|.docx|.xls|.xlsx|.ppt|.pptx) 转化为pdf文件
*
* @param inputFilePath
* 源文件路径,如:"e:/test.docx"
* @param outputFilePath
* 目标文件路径,如:"e:/test_docx.pdf"
* @return
*/
public boolean localOffice2pdf(String inputFilePath, String outputFilePath) {
boolean flag = false;
OfficeDocumentConverter converter = converterUtils.getDocumentConverter();
if (null != inputFilePath) {
File inputFile = new File(inputFilePath);
// 判断目标文件路径是否为空
if (null == outputFilePath) {
// 转换后的文件路径
String outputFilePath_end = getOutputFilePath(inputFilePath);
if (inputFile.exists()) {// 找不到源文件, 则返回
converterFile(inputFile, outputFilePath_end, inputFilePath,
outputFilePath, converter);
flag = true;
}
} else {
if (inputFile.exists()) {// 找不到源文件, 则返回
converterFile(inputFile, outputFilePath, inputFilePath,
outputFilePath, converter);
flag = true;
}
}
} else {
flag = false;
}
return flag;
}
/**
* 获取输出文件
*
* @param inputFilePath
* @return
*/
public static String getOutputFilePath(String inputFilePath) {
String outputFilePath = inputFilePath.replaceAll("." + getPostfix(inputFilePath), ".pdf");
return outputFilePath;
}
/**
* 获取inputFilePath的后缀名,如:"e:/test.pptx"的后缀名为:"pptx"
*
* @param inputFilePath
* @return
*/
public static String getPostfix(String inputFilePath) {
return inputFilePath.substring(inputFilePath.lastIndexOf(".") + 1);
}
}