上传的Word 转 pdf ,实现在线预览功能
上传Word 文件,转PDF格式,实现在线预览功能;
下载一个 OpenOffice 4.1.6 ,解压运行,安装到电脑上,就是通过openOffice 的api进行转换的;
//这个是一个controller
@Controller
@RequestMapping(value = "${adminPath}/enterprise/ecsSysPolicyAnnex")
public class EcsSysPolicyAnnexController extends BaseController {
//这个是一个form 保存功能,其中就有一个文件上传功能
@RequiresPermissions("enterprise:ecsSysPolicyAnnex:edit")
@RequestMapping(value = "save")
public String save(MultipartFile multipartFile, EcsSysPolicyAnnex ecsSysPolicyAnnex, Model model,
HttpServletRequest request, RedirectAttributes redirectAttributes) throws Exception {
if (!beanValidator(model, ecsSysPolicyAnnex)) {
return form(ecsSysPolicyAnnex, model);
}
// 上传文件功能的实现,返回保存路径
String path = ecsSysPolicyAnnexService.uploadFile(multipartFile, request);
if (!StringUtils.isBlank(path)) {
ecsSysPolicyAnnex.setFileurl(path);
}
ecsSysPolicyAnnexService.save(ecsSysPolicyAnnex);
addMessage(redirectAttributes, "保存政策附件表成功");
return "redirect:" + Global.getAdminPath() + "/enterprise/ecsSysPolicyAnnex/?repage";
}
}
//这个是service 层方法
/**
* 上传文件
*/
public String uploadFile(MultipartFile multipartFile, HttpServletRequest request) throws Exception {
// 解决文件重名问题
String finalFileName = UUID.randomUUID().toString()
+ multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf("."));
// 判断后缀名是否是(.doc.docx.pdf)
String[] allowTypes = new String[] { "docx", "doc", "pdf" };
int splitIndex = finalFileName.lastIndexOf(".");
String fileType = finalFileName.substring(splitIndex + 1);// doc、docx、pdf
String path = "";
// 包含在docx,doc,pdf时,将path保存,否则,不保存(因为是非必填项);
if (isHasSuffix(fileType, allowTypes)) {
// 获取上传文件的路径
path = request.getSession().getServletContext().getRealPath("static") + File.separator + finalFileName;
if (!new File(path).exists()) {
new File(path).mkdirs();
}
multipartFile.transferTo(new File(path));
// 将Word转成PDF(docx,doc-->pdf)
path = word2pdf(path);
}
return path;
}
/**
* 判断类型是否包含这些
*
* @param fileType
* @return
*/
private static boolean isHasSuffix(String fileType, String... allowTypes) {
Boolean CanUploaded = isValid(fileType, allowTypes);
if (CanUploaded) {
// System.out.println("允许上传!");
return true;
} else {
// System.out.println("禁止上传!");
return false;
}
}
/**
* 判断是否为空;
*
* @param contentType
* @param allowTypes
* @return
*/
public static boolean isValid(String contentType, String... allowTypes) {
if (null == contentType || "".equals(contentType)) {
return false;
}
for (String type : allowTypes) {
if (contentType.indexOf(type) > -1) {
return true;
}
}
return false;
}
/**
* 将上传的文件转换为pdf格式,方便在线预览
*
* @param path:Word所在文件路径
* @return :返回PDF格式文件路径
* @throws Exception
*/
private String word2pdf(String path) throws Exception {
// 要转换的文件及地址
File pdf = new File(path);
// openoffice.paht 是 properties 配置文件中配置的openoffice 的安装地址; 比如我的 : openoffice.paht = C:\\Program Files (x86)\\OpenOffice 4\\program
String configPath = Global.getConfig("openoffice.paht");
// 转换工具所在的安装目录(配置文件中);
Word2PdfConvertor wp = new Word2PdfConvertor(configPath);
// 转换为PDF文件
File convert = wp.convert(pdf);
// 获取 PDF文件路径
String courseFile = convert.getCanonicalPath();
// 获取PDF文件名称及路径
return courseFile;
}
// 这个是工具类,可以 pdf 转图片,可以文本转图片,文本转 PDF ,Word 转图片,Word 转 pdf ,看你需要什么,就调用什么;
// 工具类,也给贴出来了;
package com.thinkgem.jeesite.modules.utils;
import java.io.File;
import java.io.IOException;
import java.net.ConnectException;
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;
/**
* 将Word文档转换成pdf文件
* <p>此功能依赖于OpenOffice提供的文件转换服务</p>
* @author hkrj
*
*/
public class Word2PdfConvertor implements IConvertor {
private String sofficePath;
private OpenOfficeConnection connection = null;
private int port =8100;
/**
* 创建word转换pdf转换器,此工具需要OpenOffice软件支持
* @param sofficePath soffice命令所在的目录
* @throws Exception
*/
public Word2PdfConvertor(String sofficePath) throws Exception{
this.sofficePath=sofficePath;
this.connection = new SocketOpenOfficeConnection(8100);
//启动OpenOffice转换服务
if(!this.checkOpenOfficeConnection(this.connection)){
this.startOpenOfficeConverterService();
}
}
/**
* 创建word转换pdf转换器,此工具需要OpenOffice软件支持
* @param sofficePath soffice命令所在的目录
* @param port soffice服务运行的端口号,默认端口号为8100
* @throws Exception
*/
public Word2PdfConvertor(String sofficePath,int port) throws Exception{
this(sofficePath);
this.port=port;
}
@Override
public File convert(File srcFile) throws Exception {
OpenOfficeConnection connection = new SocketOpenOfficeConnection(this.port);
File outputFile = null;
try {
connection.connect();
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
String filename = srcFile.getAbsolutePath();
filename=filename.substring(0,filename.lastIndexOf("."))+".pdf";
outputFile=new File(filename);
converter.convert(srcFile, outputFile);
} catch (ConnectException e) {
throw new Exception(e);
}finally {
if(connection!=null){
connection.disconnect();
}
}
return outputFile;
}
/**
* 启动OpenOffice转换服务
*
* @return
* @throws IOException
*/
public synchronized void startOpenOfficeConverterService() throws IOException {
String commandStr = this.prepareCommand();
Runtime.getRuntime().exec(commandStr, null,new File(this.sofficePath));
}
/**
* 根据当前系统类型准备启动OpenOffice转换服务的命令
* @return 返回命令字符串,如果获取不到系统类型则返回null
*/
public String prepareCommand() {
String osname = this.getOSType();
if (osname == null) {
throw new RuntimeException("获取不到当前系统类型");
}
if ("windows".equals(osname)) {
return "cmd /c soffice.exe -headless -accept=\"socket,host=127.0.0.1,port="+this.port+";urp;\" -nofirststartwizard";
}
if ("linux".equals(osname) || "mac".equals(osname) || "unix".equals(osname)) {
return "soffice --headless -accept=\"socket,host=127.0.0.1,port="+this.port+";urp;\" --nofirststartwizard";
}
return null;
}
/**
* 获取当前系统类型
*
* @return 如果获取不到系统类型则返回null,否则根据实际情况返回[windows/linux/mac/unix]
*/
public String getOSType() {
String osName = System.getProperty("os.name");
osName = osName.toLowerCase();
if (osName.contains("windows")) {
return "windows";
}
if (osName.contains("linux")) {
return "linux";
}
if (osName.contains("mac")) {
return "mac";
}
if (osName.contains("unix")) {
return "unix";
}
return null;
}
/**
* 检测OpenOffice转换服务是否已经启动
*
* @param connection
* OpenOffice转换服务连接,如果connection为null则方法直接返回false
* @return 如果转换服务已经启动并能联通则返回true否则返回false
*/
public boolean checkOpenOfficeConnection(OpenOfficeConnection connection) {
if (connection == null) {
return false;
}
boolean isConnection = true;
try {
connection.connect();
connection.disconnect();
} catch (ConnectException e) {
isConnection = false;
}
return isConnection;
}
}
//用到了两个jar 包
自此,Word上传转pdf 预览功能 完成;
这个得思考着写,大概的思路就是这样;
记录一下;