123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- package com.ruoyi.project.officeConvert;
- import com.ruoyi.common.constant.Constants;
- import com.ruoyi.common.constant.HttpStatus;
- import com.ruoyi.common.utils.StringUtils;
- import com.ruoyi.framework.config.RuoYiConfig;
- import com.ruoyi.framework.web.controller.BaseController;
- import com.ruoyi.framework.web.domain.AjaxResult;
- import org.jodconverter.DocumentConverter;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.stereotype.Component;
- import org.springframework.web.bind.annotation.*;
- import org.springframework.web.context.request.RequestContextHolder;
- import org.springframework.web.context.request.ServletRequestAttributes;
- import javax.annotation.Resource;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.*;
- import java.nio.charset.StandardCharsets;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import static com.ruoyi.project.officeConvert.PptPreview.pptToImage;
- import static com.ruoyi.project.officeConvert.PptPreview.pptxToImage;
- @Component
- @RestController
- @RequestMapping(value="/office",method = RequestMethod.POST)
- public class OfficeConvertController {
- // 第一步:转换器直接注入
- @Resource
- DocumentConverter documentConverter;
- protected final Logger logger = LoggerFactory.getLogger(BaseController.class);
- private static String successMsg="请求成功!请预览文件!";
- private static String failMsg="暂不支持此格式类型文件预览,请下载后查看!";
- private static String codeMiss="若csv文件预览结果有乱码,请重新上传编码格式另存为ANSI的csv文件!";
- private static String fileMiss="您需要预览的文件不存在,可能已在本地删除,请重新上传即可!";
- /**
- office类型的文件
- 先远程服务端获取文件
- 然后转换
- 然后读写缓冲区返回前台
- */
- @PostMapping("/toPdfFile")
- public AjaxResult toPdfFile(HttpServletRequest request, HttpServletResponse response,String filepath) {
- // 获取HttpServletResponse
- response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
- String newFilePath=filepath.replace("/profile","");
- // 需要转换的文件路径
- File file = new File(RuoYiConfig.getProfile()+newFilePath);
- boolean flag= file.exists();
- if(flag==false){
- return new AjaxResult(HttpStatus.SUCCESS,fileMiss,Constants.RESOURCE_PREFIX+ "/" + newFilePath);
- }
- String converterPdf =""; //生成的文件名
- try {
- // 转换之后文件生成的本地地址
- File newFile = new File(RuoYiConfig.getProfile());
- if (!newFile.exists()) {
- newFile.mkdirs();
- }
- String name =file.getName();
- int t=name.lastIndexOf(".");
- String newName=name.substring(0,t);
- //根据文件类型判断转换方式
- if(newFilePath.endsWith(".docx")||newFilePath.endsWith(".doc")||newFilePath.endsWith(".xlsx")
- ||newFilePath.endsWith(".xls")||newFilePath.endsWith(".csv")||newFilePath.endsWith(".txt")){
- converterPdf = newName+".html";
- }else if(newFilePath.endsWith(".mp4")||newFilePath.endsWith("pdf")||newFilePath.endsWith(".gif")
- ||newFilePath.endsWith("jpg")||newFilePath.endsWith("png")
- ||newFilePath.endsWith(".jpeg")){
- //浏览器可以直接打开的直接返回图片和视频的文件路径
- return new AjaxResult(HttpStatus.SUCCESS,successMsg,Constants.RESOURCE_PREFIX+ "/" + newFilePath) ;
- }else {
- //其他类型都不支持就返回错误消息
- return new AjaxResult(HttpStatus.SUCCESS,failMsg,Constants.RESOURCE_PREFIX+ "/" + newFilePath);
- }
- // 文件转化
- documentConverter.convert(file).to(new File(RuoYiConfig.getProfile() + File.separator +"temp" + File.separator +converterPdf)).execute();
- //office文件需要给有表格的加一个边框 以免 排版出现问题
- if(newFilePath.endsWith(".xlsx")){
- this.doActionConvertedFile(RuoYiConfig.getProfile() + File.separator +"temp" + File.separator +converterPdf);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- //最后应该返回转换后的文件名称
- String pathFileName = Constants.RESOURCE_PREFIX+ File.separator +"temp" + File.separator + converterPdf;
- return newFilePath.endsWith(".csv")? new AjaxResult(HttpStatus.SUCCESS,codeMiss,pathFileName): new AjaxResult(HttpStatus.SUCCESS,successMsg,pathFileName) ;
- }
- @PostMapping("/toBookFile")
- public AjaxResult toBookFile(HttpServletRequest request, HttpServletResponse response,String filepath) {
- // 获取HttpServletResponse
- response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
- String newFilePath=filepath.replace("/profile","");
- // 需要转换的文件路径
- File file = new File(RuoYiConfig.getProfile()+newFilePath);
- boolean flag= file.exists();
- if(flag==false){
- return new AjaxResult(HttpStatus.SUCCESS,fileMiss,Constants.RESOURCE_PREFIX+ "/" + newFilePath);
- }
- String converterPdf =""; //生成的文件名
- try {
- // 转换之后文件生成的本地地址
- File newFile = new File(RuoYiConfig.getProfile());
- if (!newFile.exists()) {
- newFile.mkdirs();
- }
- String name =file.getName();
- int t=name.lastIndexOf(".");
- String newName=name.substring(0,t);
- //预约开票的word文档
- converterPdf = newName+".pdf";
- // 文件转化
- documentConverter.convert(file).to(new File(RuoYiConfig.getProfile() + File.separator +"temp" + File.separator +converterPdf)).execute();
- //office文件需要给有表格的加一个边框 以免 排版出现问题
- // this.doActionConvertedFile(RuoYiConfig.getProfile() + File.separator +"temp" + File.separator +converterPdf);
- } catch (Exception e) {
- e.printStackTrace();
- }
- //最后应该返回转换后的文件名称
- String pathFileName = Constants.RESOURCE_PREFIX+ File.separator +"temp" + File.separator + converterPdf;
- return new AjaxResult(HttpStatus.SUCCESS,successMsg,pathFileName) ;
- }
- public String wordTransPdf(String filepath) {
- // 获取HttpServletResponse
- String newFilePath=filepath.replace("/profile","");
- // 需要转换的文件路径
- File file = new File(RuoYiConfig.getProfile()+newFilePath);
- boolean flag= file.exists();
- if(flag==false){
- logger.error("文件不存在");
- }
- String converterPdf =""; //生成的文件名
- try {
- // 转换之后文件生成的本地地址
- File newFile = new File(RuoYiConfig.getProfile());
- if (!newFile.exists()) {
- newFile.mkdirs();
- }
- String name =file.getName();
- int t=name.lastIndexOf(".");
- String newName=name.substring(0,t);
- //预约开票的word文档
- converterPdf = newName+".pdf";
- // 文件转化
- documentConverter.convert(file).to(new File(RuoYiConfig.getProfile() + File.separator +"temp" + File.separator +converterPdf)).execute();
- } catch (Exception e) {
- e.printStackTrace();
- }
- //最后应该返回转换后的文件名称
- String pathFileName = Constants.RESOURCE_PREFIX+ File.separator +"temp" + File.separator + converterPdf;
- return pathFileName;
- }
- /**
- PPT文件需要根据不同格式类型区分一下
- */
- @PostMapping("/PPTransJPEG")
- public AjaxResult PPTransJPEG(HttpServletRequest request, HttpServletResponse response,String filepath) {
- Map<String, Object> resultMap = new HashMap<>();
- String newFilePath=filepath.replace("/profile","");
- // 需要转换的PPT文件路径
- File file = new File(RuoYiConfig.getProfile()+newFilePath);
- //判断ppt,pptx文件是否存在本地
- boolean flag= file.exists();
- if(flag==false){
- return new AjaxResult(HttpStatus.SUCCESS,fileMiss,Constants.RESOURCE_PREFIX+ "/" + newFilePath);
- }
- File imageFile = new File(RuoYiConfig.getProfile() + File.separator + "temp");
- if (!imageFile.exists()){
- imageFile.mkdirs();
- } //判断生成文件路径是否已存在
- String name =file.getName();
- int t=name.lastIndexOf(".");
- String newName=name.substring(0,t); //将名字带到生成方法中以便于区分不同文件名的ppt
- List list =new ArrayList();
- if(newFilePath.endsWith("pptx")){
- list= pptToImage(file, imageFile,newName);
- }else {
- list= pptxToImage(file, imageFile,newName);
- }
- //将生成的图片传给前端
- resultMap.put("imagePathList", list);
- // resultMap.put("reviewUrlPrefix", Constants.RESOURCE_PREFIX+ "/" );
- return new AjaxResult(HttpStatus.SUCCESS,successMsg,resultMap);
- }
- private static final String getPathFileName(String uploadDir, String fileName) throws IOException
- {
- int dirLastIndex = RuoYiConfig.getProfile().length() + 1;
- String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
- String pathFileName = Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName;
- return pathFileName;
- }
- /**
- * 对转换后的文件进行操作(改变编码方式)
- *
- * @param outFilePath 文件绝对路径
- */
- public void doActionConvertedFile(String outFilePath) {
- StringBuilder sb = new StringBuilder();
- try (InputStream inputStream = new FileInputStream(outFilePath);
- BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, System.getProperty("sun.jnu.encoding")))) {
- String line;
- while (null != (line = reader.readLine())) {
- if (line.contains("charset=gb2312")) {
- line = line.replace("charset=gb2312", "charset=utf-8");
- }
- sb.append(line);
- }
- // 添加sheet控制头
- sb.append("<script src=\"js/jquery-3.0.0.min.js\" type=\"text/javascript\"></script>");
- sb.append("<script src=\"js/excel.header.js\" type=\"text/javascript\"></script>");
- sb.append("<link rel=\"stylesheet\" href=\"bootstrap/css/bootstrap.min.css\">");
- } catch (IOException e) {
- e.printStackTrace();
- }
- // 重新写入文件
- try (FileOutputStream fos = new FileOutputStream(outFilePath);
- BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos, StandardCharsets.UTF_8))) {
- writer.write(sb.toString());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
|