哈哈 2021 上班的第一天就深感忧虑 在家玩的太久 感觉自己需要充电啦
当时为了项目进度 随意在网上找了一个是 word excel 图片转html之后展示;效果不是很理想。word,图片还可以,excel就很丑。今天又写了一个借助 openOffice实现在线预览功能;
引用的jar包
<dependency>
<groupId>org.artofsolving.jodconverter</groupId>
<artifactId>jodconverter-core</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/jodconverter-core-3.0-beta-4.jar</systemPath>
</dependency>
<!-- lombok简化实体类getter setter代码-->
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-core</artifactId>
<version>4.0.0-RELEASE</version>
</dependency>
<!-- lombok简化实体类getter setter代码-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.6</version>
</dependency>
在这里因为jodconverter-core 引入不了,所以需要把jar包下载下来,在引入项目中。jar包下载链接
Controller层
@RestController
@CrossOrigin
public class OpenOfficeController {
private static final Log LOG = LogFactory.getLog(OpenOfficeController.class);
@ResponseBody
@GetMapping("/getFile") //, int id
public void readFile(HttpServletResponse response ) {
String filePath = "G:\\国土信息平台\\基础信息平台的功能业务拆分(1).docx";
try {
//源文件的路径
// String filePath = request.getParameter("filePath");
File file = FilePreviewUtil.openOfficeToPdf(filePath);
//把转换后的pdf文件响应到浏览器上面
FileInputStream fileInputStream = new FileInputStream(file);
BufferedInputStream br = new BufferedInputStream(fileInputStream);
byte[] buf = new byte[1024];
int length;
// 清除首部的空白行。非常重要
response.reset();
//设置调用浏览器嵌入pdf模块来处理相应的数据。
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
OutputStream out = response.getOutputStream();
//写文件
while ((length = br.read(buf)) != -1) {
out.write(buf, 0, length);
}
br.close();
out.close();
} catch (Exception e) {
LOG.error("在线预览异常", e);
}
}
}
文件预览工具类
public class FilePreviewUtil {
private static final Log LOG = LogFactory.getLog(FilePreviewUtil.class);
private FilePreviewUtil(){
}
/**
* 使Office2003-2007全部格式的文档(.doc|.docx|.xls|.xlsx|.ppt|.pptx) 转化为pdf文件<br>
* @param inputFilePath 源文件路径源文件路径
* 源文件路径,如:"e:/test.doc"
* @return 转换后的pdf文件
*/
public static File openOfficeToPdf(String inputFilePath) {
return office2pdf(inputFilePath);
}
/**
* 根据操作系统的名称,获取OpenOffice.org 4的安装目录<br>
* 如我的OpenOffice.org 4安装在:C:\Program Files (x86)\OpenOffice 4
* 请根据自己的路径做相应的修改
* @return OpenOffice.org 4的安装目录
*/
private static String getOfficeHome() {
String osName = System.getProperty("os.name");
System.out.println("操作系统名称:" + osName);
if (Pattern.matches(Constant.LINUX_SYSTEM.getDescribe(), osName)) {
return "/opt/openoffice.org4";
} else if (Pattern.matches(Constant.WINDOWS_SYSTEM.getDescribe(), osName)) {
return Constant.DEFAULT_INSTALL_PATH.getDescribe();
} else if (Pattern.matches(Constant.MAC_SYSTEM.getDescribe(), osName)) {
return "/Applications/OpenOffice.org.app/Contents/";
}
return Constant.DEFAULT_INSTALL_PATH.getDescribe();
}
/**
* 连接OpenOffice.org 并且启动OpenOffice.org
* @return OfficeManager对象
*/
private static OfficeManager getOfficeManager() {
DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration();
// 设置OpenOffice.org 的安装目录
String officeHome = getOfficeHome();
config.setOfficeHome(officeHome);
// 启动OpenOffice的服务
OfficeManager officeManager = config.buildOfficeManager();
officeManager.start();
return officeManager;
}
/**
* 把源文件转换成pdf文件
* @param inputFile 文件对象
* @param outputFilePath pdf文件路径
* @param inputFilePath 源文件路径
* @param converter 连接OpenOffice
*/
private static File converterFile(File inputFile, String outputFilePath, String inputFilePath, OfficeDocumentConverter converter) {
File outputFile = new File(outputFilePath);
// 假如目标路径不存在,则新建该路径
if (!outputFile.getParentFile().exists()) {
outputFile.getParentFile().mkdirs();
}
converter.convert(inputFile, outputFile);
System.out.println("文件:" + inputFilePath + "\n转换为\n目标文件:" + outputFile + "\n成功!");
return outputFile;
}
/**
* 使Office2003-2007全部格式的文档(.doc|.docx|.xls|.xlsx|.ppt|.pptx) 转化为pdf文件<br>
* @param inputFilePath 源文件路径
* 源文件路径,如:"e:/test.doc"
* 目标文件路径,如:"e:/test_doc.pdf"
* @return 对应的pdf文件
*/
private static File office2pdf(String inputFilePath) {
OfficeManager officeManager = null;
try {
if (StringUtils.isEmpty(inputFilePath)) {
LOG.info("输入文件地址为空,转换终止!");
return null;
}
File inputFile = new File(inputFilePath);
// 转换后的文件路径 这里可以自定义转换后的路径,这里设置的和源文件同文件夹
String outputFilePath = getOutputFilePath(inputFilePath);
if (!inputFile.exists()) {
LOG.info("输入文件不存在,转换终止!");
return null;
}
// 获取OpenOffice的安装路劲
officeManager = getOfficeManager();
// 连接OpenOffice
OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
return converterFile(inputFile, outputFilePath, inputFilePath, converter);
} catch (Exception e) {
LOG.error("转化出错!", e);
} finally {
// 停止openOffice
if (officeManager != null) {
officeManager.stop();
}
}
return null;
}
/**
* 获取输出文件路径 可自定义
* @param inputFilePath 源文件的路径
* @return 取输出pdf文件路径
*/
private static String getOutputFilePath(String inputFilePath) {
return inputFilePath.replaceAll("." + getPostfix(inputFilePath), ".pdf");
}
/**
* 获取inputFilePath的后缀名,如:"e:/test.doc"的后缀名为:"doc"<br>
* @param inputFilePath 源文件的路径
* @return 源文件的后缀名
*/
private static String getPostfix(String inputFilePath) {
int index = inputFilePath.lastIndexOf('.');
return inputFilePath.substring(index+1);
}
}
枚举
@AllArgsConstructor
public enum Constant {
/**
* 使用的浏览器是linux系统
*/
LINUX_SYSTEM(1, "Linux.*"),
/**
* 使用的浏览器是windows系统
*/
WINDOWS_SYSTEM(2, "Windows.*"),
/**
* 使用的浏览器是mac系统
*/
MAC_SYSTEM(3, "Mac.*"),
/**
* 默认的OpenOffice安装路径 (默认为windows的)
*/
DEFAULT_INSTALL_PATH(4, "C:\\Program Files (x86)\\OpenOffice 4");
/**
* 编码(备用)
*/
@Getter
private int code;
/**
* 常量描述或常量赋值
*/
@Getter
private String describe;
}