package com.ruoyi.pams.util;
import com.aspose.cells.PdfSaveOptions;
import com.aspose.cells.Workbook;
import com.aspose.words.Document;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
import org.apache.commons.io.FileUtils;
import java.io.*;
public class Word2PdfAsposeUtil {
public static boolean getLicense() {
boolean result = false;
try {
// license.xml应放在..\WebRoot\WEB-INF\classes路径下
//InputStream is = Word2PdfAsposeUtil.class.getClassLoader().getResourceAsStream("\\license.xml");
InputStream is = Word2PdfAsposeUtil.class.getClassLoader().getResourceAsStream("license.xml");
License aposeLic = new License();
aposeLic.setLicense(is);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static boolean doc2pdf(String inPath, String outPath) {
// 验证License 若不验证则转化出的pdf文档会有水印产生
if (!getLicense()) {
return false;
}
FileOutputStream os = null;
try {
long old = System.currentTimeMillis();
File file = new File(outPath); // 新建一个空白pdf文档
os = new FileOutputStream(file);
//Address是将要被转化的word文档,全面支持DOC, DOCX, OOXML, RTF HTML,OpenDocument, PDF,EPUB, XPS, SWF 相互转换
Document doc = new Document(inPath);
doc.save(os, SaveFormat.PDF);
long now = System.currentTimeMillis();
//转化用时
System.out.println("word->pdf转换成功,共耗时:" + ((now - old) / 1000.0) + "秒");
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (os != null) {
try {
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
}
/**
* excel 转为pdf 输出。
*
* @param sourceFilePath excel文件
* @param desFilePathd pad 输出文件目录
*/
public static void excel2pdf(String sourceFilePath, String desFilePathd) {
// 验证License 若不验证则转化出的pdf文档会有水印产生
if (!getLicense()) {
return;
}
try {
Workbook wb = new Workbook(sourceFilePath);// 原始excel路径
FileOutputStream fileOS = new FileOutputStream(desFilePathd);
PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
pdfSaveOptions.setOnePagePerSheet(true);//把内容放在一张PDF 页面上;
wb.save(fileOS, pdfSaveOptions);
fileOS.flush();
fileOS.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 将word txt转换成pdf
* @param inPath
* @param outPath
* @author zsqing
*/
public void wordAndTextToPdf(String inPath, String outPath /*, String localIP, HttpServletRequest request*/)
{
String fileToPdfUrl="";
boolean flag = false;
File file = null;
FileOutputStream os = null;
try
{
//long old = System.currentTimeMillis();
// 新建一个空白文档
file = new File(outPath);
file = saveAsUTF8(file);
os = new FileOutputStream(file);
// InPath是将要被转化的文档
com.aspose.words.Document doc = new com.aspose.words.Document(inPath);
/*
* 全面支持DOC,DOCX进行OOXML,RTF,HTML,OpenDocument,PDF,EPUB,XPS,SWF间转换
*/
doc.save(os, SaveFormat.PDF);
flag = true;
//long now = System.currentTimeMillis();
//System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒"); // 转化用时
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if (os != null)
{
os.close();
}
}
catch (Exception e)
{
e.printStackTrace();
}
if (!flag)
{
file.deleteOnExit();
}
}
}
/* 将txt 转换编码
* @param file
* @author zsqing
*/
public File saveAsUTF8(File file){
String code = "gbk";
byte[] head = new byte[3];
try {
InputStream inputStream = new FileInputStream(file);
inputStream.read(head);
if (head[0] == -1 && head[1] == -2) {
code = "UTF-16";
} else if (head[0] == -2 && head[1] == -1) {
code = "Unicode";
} else if (head[0] == -17 && head[1] == -69 && head[2] == -65) {
code = "UTF-8";
}
inputStream.close();
System.out.println(code);
if (code.equals("UTF-8")) {
return file;
}
String str = FileUtils.readFileToString(file, code);
FileUtils.writeStringToFile(file, str, "UTF-8");
System.out.println("转码结束");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return file;
}
}
package com.ruoyi.pams.service.impl;
import java.io.*;
import java.util.Arrays;
import java.util.List;
import com.ruoyi.common.annotation.DataAuthorityScope;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.config.UploadConfig;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.exception.user.CustomException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.ApplicationContextUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.pams.domain.PtpFileupload;
import com.ruoyi.pams.domain.TeFileupload;
import com.ruoyi.pams.mapper.PtpFileuploadMapper;
import com.ruoyi.pams.mapper.TeFileuploadMapper;
import com.ruoyi.pams.util.Word2PdfAsposeUtil;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.mapper.SysConfigMapper;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.weaver.loadtime.Aj;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import com.ruoyi.pams.mapper.LaboratoryFileuploadMapper;
import com.ruoyi.pams.domain.LaboratoryFileupload;
import com.ruoyi.pams.service.ILaboratoryFileuploadService;
import org.springframework.web.multipart.MultipartFile;
import javaslang.control.Try;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
/**
* 实验室认可和资质认定Service业务层处理
*
* @author wangwei
* @date 2023-05-05
*/
@Service
@Slf4j
public class LaboratoryFileuploadServiceImpl implements ILaboratoryFileuploadService {
@Autowired
private LaboratoryFileuploadMapper laboratoryFileuploadMapper;
@Autowired
private PtpFileuploadMapper ptpFileuploadMapper;
@Autowired
private TeFileuploadMapper teFileuploadMapper;
@Autowired
private SysConfigMapper sysConfigMapper;
/**
* 允许上传的格式
*/
private final List<String> ALLOW_EXCEL_FORM
= Arrays.asList(".doc", ".docx", ".xls", ".xlsx", ".ppt", ".txt", ".pdf", ".png", ".jpg", ".sql");
/**
* 查询实验室认可和资质认定
*
* @param lfid 实验室认可和资质认定主键
* @return 实验室认可和资质认定
*/
@Override
public LaboratoryFileupload selectLaboratoryFileuploadByLfid(Long lfid) {
return laboratoryFileuploadMapper.selectLaboratoryFileuploadByLfid(lfid);
}
/**
* 查询实验室认可和资质认定列表
*
* @param laboratoryFileupload 实验室认可和资质认定
* @return 实验室认可和资质认定
*/
@Override
public List<LaboratoryFileupload> selectLaboratoryFileuploadList(LaboratoryFileupload laboratoryFileupload) {
return laboratoryFileuploadMapper.selectLaboratoryFileuploadList(laboratoryFileupload);
}
/**
* 新增实验室认可和资质认定
*
* @param laboratoryFileupload 实验室认可和资质认定
* @return 结果
*/
@Override
@Log(title = "实验室认可和资质认定", businessType = BusinessType.INSERT)
//@DataAuthorityScope
public AjaxResult insertLaboratoryFileupload(LaboratoryFileupload laboratoryFileupload) {
int i = laboratoryFileuploadMapper.insertLaboratoryFileupload(laboratoryFileupload);
if (i == 0) {
return AjaxResult.error("新增业务单据数据失败,请联系管理员!");
}
Integer integer = laboratoryFileuploadMapper.selectMaxId("select @@IDENTITY;");
LaboratoryFileupload laboratoryFileupload1 = laboratoryFileuploadMapper.selectLaboratoryFileuploadByLfid(Long.valueOf(integer));
return AjaxResult.success(laboratoryFileupload1);
}
/**
* 修改实验室认可和资质认定
*
* @param laboratoryFileupload 实验室认可和资质认定
* @return 结果
*/
@Log(title = "实验室认可和资质认定", businessType = BusinessType.UPDATE)
@Override
//@DataAuthorityScope
public int updateLaboratoryFileupload(LaboratoryFileupload laboratoryFileupload) {
return laboratoryFileuploadMapper.updateLaboratoryFileupload(laboratoryFileupload);
}
/**
* 批量删除实验室认可和资质认定
*
* @param lfids 需要删除的实验室认可和资质认定主键
* @return 结果
*/
@Override
public int deleteLaboratoryFileuploadByLfids(Long[] lfids) {
return laboratoryFileuploadMapper.deleteLaboratoryFileuploadByLfids(lfids);
}
/**
* 删除实验室认可和资质认定信息
*
* @param lfid 实验室认可和资质认定主键
* @return 结果
*/
@Override
public int deleteLaboratoryFileuploadByLfid(Long lfid) {
return laboratoryFileuploadMapper.deleteLaboratoryFileuploadByLfid(lfid);
}
/**
* 附件上传
*
* @param file
* @param id
* @return
*/
@Override
public String uploadPreviewFile(MultipartFile file, int id, int funNo) {
// 判断附件类型
String extension = "." + FileUploadUtils.getExtension(file);
if (!ALLOW_EXCEL_FORM.contains(extension.toLowerCase())) {
throw new CustomException("请上传正确的文件类型");
}
/*Date date = null;
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String now = df.format(date);
String[] yearMonthDay = now.split("-");*/
UploadConfig uploadConfig = ApplicationContextUtils.getBean(UploadConfig.class);
String shortPath = uploadConfig.getRootUploadPath() /*+ yearMonthDay[0] + File.separator + yearMonthDay[1] + File.separator*/;
String[] split = file.getOriginalFilename().split("\\.");
String primaryKey = split[0]; // 删除老的
// TMisBlobTemplate templateToDelete = tMisBlobTemplateMapper.selectTMisBlobTemplateByFunNo(funNo);
LaboratoryFileupload laboratoryFileupload = laboratoryFileuploadMapper.selectLaboratoryFileuploadByLfid(Long.valueOf(id));
/* if (laboratoryFileupload != null) {
FileUtils.deleteFile(
shortPath + laboratoryFileupload.getLfid()+ laboratoryFileupload.getType());
laboratoryFileuploadMapper.deleteLaboratoryFileuploadByLfid(Long.valueOf(id));
}*/
String filePath = primaryKey + extension;
// 临时文件
File localTempFile = new File(shortPath + primaryKey + extension);
if (!localTempFile.getParentFile().exists()) {
localTempFile.getParentFile().mkdir();
}
if (!localTempFile.exists()) {
Try.run(localTempFile::createNewFile).onFailure(e -> log.error("新增文件失败"));
}
Try.run(() -> file.transferTo(localTempFile)).onFailure(e -> log.error("上传失败"));
if (1020 == funNo) {//实验室认可和资质
LaboratoryFileupload newLaboratoryFileupload = new LaboratoryFileupload();
newLaboratoryFileupload.setLfid(Long.valueOf(id));
newLaboratoryFileupload.setType(extension);
newLaboratoryFileupload.setFilename(primaryKey);
newLaboratoryFileupload.setFilepath(filePath);
int i = laboratoryFileuploadMapper.updateLaboratoryFileupload(newLaboratoryFileupload);
if (i != 1) {
throw new CustomException("文件上传失败!");
}
} else if (1030 == funNo) {// 能力提供者
PtpFileupload ptpFileupload = new PtpFileupload();
ptpFileupload.setLfid(Long.valueOf(id));
ptpFileupload.setType(extension);
ptpFileupload.setFilename(primaryKey);
ptpFileupload.setFilepath(filePath);
int i = ptpFileuploadMapper.updatePtpFileupload(ptpFileupload);
if (i != 1) {
throw new CustomException("文件上传失败!");
}
} else if (1040 == funNo) {// 常用文件
TeFileupload teFileupload = new TeFileupload();
teFileupload.setFileuploadid(Long.valueOf(id));
teFileupload.setType(extension);
teFileupload.setFilename(primaryKey);
teFileupload.setFilepath(filePath);
int i = teFileuploadMapper.updateTeFileupload(teFileupload);
if (i != 1) {
throw new CustomException("文件上传失败!");
}
}
return "文件上传成功";
}
/***
* 附件下载
* @param id
* @param response
* @return
*/
@Override
public void downloadFile(Long id, HttpServletResponse response, int funNo) {
String filePathLast = "";
if (funNo == 1020) {//实验室认可和资质
LaboratoryFileupload laboratoryFileupload = laboratoryFileuploadMapper.selectLaboratoryFileuploadByLfid(id);
if (StringUtils.isEmpty(laboratoryFileupload.getFilepath())) {
throw new CustomException("附件不存在,请联系管理员!");
}
filePathLast = laboratoryFileupload.getFilepath();
} else if (funNo == 1030) {//能力提供者
PtpFileupload ptpFileupload = ptpFileuploadMapper.selectPtpFileuploadByLfid(id);
if (StringUtils.isEmpty(ptpFileupload.getFilepath())) {
throw new CustomException("附件不存在,请联系管理员!");
}
filePathLast = ptpFileupload.getFilepath();
} else if (funNo == 1040) {//常用文件
TeFileupload teFileupload = teFileuploadMapper.selectTeFileuploadByFileuploadid(id);
if (StringUtils.isEmpty(teFileupload.getFilepath())) {
throw new CustomException("附件不存在,请联系管理员!");
}
filePathLast = teFileupload.getFilepath();
}
UploadConfig uploadConfig = ApplicationContextUtils.getBean(UploadConfig.class);
String rootUploadPath = uploadConfig.getRootUploadPath();
String filePath = rootUploadPath + filePathLast;
String downloadPath = filePath;
// 下载名称
String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
if ( filePathLast.contains(".doc") || filePathLast.contains(".docx")) {
SysConfig sysConfig = new SysConfig();
sysConfig.setConfigKey("sys.path");
List<SysConfig> sysConfigList = sysConfigMapper.selectConfigList(sysConfig);
if (sysConfigList.size() < 1) {
throw new CustomException("数据库本地文件预览路径没有配置,请联系管理员!");
}
SysConfig sysConfig1 = new SysConfig();
sysConfig1.setConfigKey("filePath");
List<SysConfig> sysConfig1List = sysConfigMapper.selectConfigList(sysConfig1);
if (sysConfig1List.size() < 1) {
throw new CustomException("物理文件不存在,请联系管理员!");
}
String configValue = sysConfigList.get(0).getConfigValue();
//临时文件路径
String tempPath = configValue + filePathLast;
Word2PdfAsposeUtil.doc2pdf(sysConfig1List.get(0).getConfigValue() + filePathLast, configValue + filePathLast.substring(0, filePathLast.length()-4)+".pdf");
downloadPath = configValue + filePathLast.substring(0, filePathLast.length()-4)+".pdf";
downloadName = filePathLast.substring(0, filePathLast.length()-4)+".pdf";
}
if (filePathLast.contains(".xls") || filePathLast.contains(".xlsx") ) {
SysConfig sysConfig = new SysConfig();
sysConfig.setConfigKey("sys.path");
List<SysConfig> sysConfigList = sysConfigMapper.selectConfigList(sysConfig);
if (sysConfigList.size() < 1) {
throw new CustomException("数据库本地文件预览路径没有配置,请联系管理员!");
}
SysConfig sysConfig1 = new SysConfig();
sysConfig1.setConfigKey("filePath");
List<SysConfig> sysConfig1List = sysConfigMapper.selectConfigList(sysConfig1);
if (sysConfig1List.size() < 1) {
throw new CustomException("物理文件不存在,请联系管理员!");
}
String configValue = sysConfigList.get(0).getConfigValue();
//临时文件路径
String tempPath = configValue + filePathLast;
Word2PdfAsposeUtil.doc2pdf(sysConfig1List.get(0).getConfigValue() + filePathLast, configValue + filePathLast.substring(0, filePathLast.length()-4)+".pdf");
Word2PdfAsposeUtil.excel2pdf(sysConfig1List.get(0).getConfigValue() + filePathLast, configValue + filePathLast.substring(0, filePathLast.length()-4)+".pdf");
downloadPath = configValue + filePathLast.substring(0, filePathLast.length()-4)+".pdf";
downloadName = filePathLast.substring(0, filePathLast.length()-4)+".pdf";
}
if (filePathLast.contains(".txt")) {
SysConfig sysConfig = new SysConfig();
sysConfig.setConfigKey("sys.path");
List<SysConfig> sysConfigList = sysConfigMapper.selectConfigList(sysConfig);
if (sysConfigList.size() < 1) {
throw new CustomException("数据库本地文件预览路径没有配置,请联系管理员!");
}
SysConfig sysConfig1 = new SysConfig();
sysConfig1.setConfigKey("filePath");
List<SysConfig> sysConfig1List = sysConfigMapper.selectConfigList(sysConfig1);
if (sysConfig1List.size() < 1) {
throw new CustomException("物理文件不存在,请联系管理员!");
}
String configValue = sysConfigList.get(0).getConfigValue();
//临时文件路径
String tempPath = configValue + filePathLast;
Word2PdfAsposeUtil.doc2pdf(sysConfig1List.get(0).getConfigValue() + filePathLast, configValue + filePathLast.substring(0, filePathLast.length()-4)+".pdf");
Word2PdfAsposeUtil.excel2pdf(sysConfig1List.get(0).getConfigValue() + filePathLast, configValue + filePathLast.substring(0, filePathLast.length()-4)+".pdf");
downloadPath = configValue + filePathLast.substring(0, filePathLast.length()-4)+".pdf";
downloadName = filePathLast.substring(0, filePathLast.length()-4)+".pdf";
}
if ( filePathLast.contains(".sql")) {
SysConfig sysConfig = new SysConfig();
sysConfig.setConfigKey("sys.path");
List<SysConfig> sysConfigList = sysConfigMapper.selectConfigList(sysConfig);
if (sysConfigList.size() < 1) {
throw new CustomException("数据库本地文件预览路径没有配置,请联系管理员!");
}
SysConfig sysConfig1 = new SysConfig();
sysConfig1.setConfigKey("filePath");
List<SysConfig> sysConfig1List = sysConfigMapper.selectConfigList(sysConfig1);
if (sysConfig1List.size() < 1) {
throw new CustomException("物理文件不存在,请联系管理员!");
}
String configValue = sysConfigList.get(0).getConfigValue();
//临时文件路径
String tempPath = configValue + filePathLast;
Word2PdfAsposeUtil word2PdfAsposeUtil = new Word2PdfAsposeUtil();
word2PdfAsposeUtil.wordAndTextToPdf(sysConfig1List.get(0).getConfigValue() + filePathLast, configValue + filePathLast.substring(0, filePathLast.length()-4)+".pdf");
downloadPath = configValue + filePathLast.substring(0, filePathLast.length()-4)+".pdf";
downloadName = filePathLast.substring(0, filePathLast.length()-4)+".pdf";
}
try {
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileUtils.setAttachmentResponseHeader(response, downloadName);
FileUtils.writeBytes(downloadPath, response.getOutputStream());
} catch (Exception e) {
throw new CustomException("下载失败!");
}
}
}
所需jar
maven
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>aspose-words</artifactId>
<version>1.25</version>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>aspose-cells</artifactId>
<version>1.25</version>
</dependency>