上传的Word 转 pdf ,实现在线预览功能 - Spring-Boot-Cloud

时间:2024-02-01 08:27:17

上传的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 预览功能 完成;

这个得思考着写,大概的思路就是这样;

记录一下;