From 340b766d5e4f3fefd7e5007d26fe2340ccc9dfe6 Mon Sep 17 00:00:00 2001 From: caihaohan Date: Mon, 3 Jun 2024 15:24:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=89=80=E6=9C=89=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E8=BD=AC=E6=8D=A2pdf=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file/controller/FileController.java | 36 ++++++ .../docking/file/serviec/FileService.java | 12 ++ .../file/serviec/impl/FileServiceImpl.java | 108 ++++++++++++++++++ .../impl/BusProcessModelHisServiceImpl.java | 2 +- .../onlyoffice/utils/OnlyOfficePdfUtil.java | 2 +- .../src/main/resources/application-dev.yml | 2 +- 6 files changed, 159 insertions(+), 3 deletions(-) create mode 100644 laws-modules-docking/src/main/java/com/jero/modules/docking/file/controller/FileController.java create mode 100644 laws-modules-docking/src/main/java/com/jero/modules/docking/file/serviec/FileService.java create mode 100644 laws-modules-docking/src/main/java/com/jero/modules/docking/file/serviec/impl/FileServiceImpl.java diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/file/controller/FileController.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/file/controller/FileController.java new file mode 100644 index 00000000..004d883e --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/file/controller/FileController.java @@ -0,0 +1,36 @@ +package com.jero.modules.docking.file.controller; + + +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.jero.common.api.vo.Result; +import com.jero.common.aspect.annotation.AutoLog; +import com.jero.modules.docking.file.serviec.FileService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@Slf4j +@RestController +@Api(tags = "文件") +@RequestMapping("/file") +public class FileController { + + @Resource + private FileService fileService; + + @GetMapping("/allDocFileTransferPdf") + @AutoLog(value = "文件-所有历史doc和docx文件生成pdf版本") + @ApiOperation(value="文件-所有历史doc和docx文件生成pdf版本", notes="文件-所有历史doc和docx文件生成pdf版本") + @ApiOperationSupport(order = 100) + public Result allDocFileTransferPdf(String fileId) { + return Result.OK(fileService.allDocFileTransferPdf(fileId)); + } + + + +} diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/file/serviec/FileService.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/file/serviec/FileService.java new file mode 100644 index 00000000..ab9856cc --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/file/serviec/FileService.java @@ -0,0 +1,12 @@ +package com.jero.modules.docking.file.serviec; + +public interface FileService { + + + /** + * 所有历史doc和docx文件生成pdf版本 + * @return + */ + String allDocFileTransferPdf(String fileId); + +} diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/file/serviec/impl/FileServiceImpl.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/file/serviec/impl/FileServiceImpl.java new file mode 100644 index 00000000..020d3b0d --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/file/serviec/impl/FileServiceImpl.java @@ -0,0 +1,108 @@ +package com.jero.modules.docking.file.serviec.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jero.common.util.IntekeyUtils; +import com.jero.common.util.MinioUtil; +import com.jero.modules.docking.file.serviec.FileService; +import com.jero.modules.onlyoffice.utils.OnlyOfficePdfUtil; +import com.jero.modules.oss.entity.OSSFile; +import com.jero.modules.oss.service.IOSSFileService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +@Slf4j +public class FileServiceImpl implements FileService { + + @Value("#{'${download.enable}'}") + private boolean enable; + + @Value("${file.path}") + private String filePath;//文件存储路径 + + @Resource + private IOSSFileService ossFileService; + + @Resource + private OnlyOfficePdfUtil onlyOfficePdfUtil; + + @Override + public String allDocFileTransferPdf(String fileIds) { + List resultList = new ArrayList<>(); + // 获取所有需要生成pdf版本的文件 + // 先获取所有有url的文件记录 + LambdaQueryWrapper ossWrapper = new LambdaQueryWrapper<>(); + ossWrapper.in(StrUtil.isNotBlank(fileIds), OSSFile::getId, Arrays.asList(fileIds.split(","))); + ossWrapper.isNotNull(OSSFile::getUrl); + List ossFileList = ossFileService.list(ossWrapper); + if (CollUtil.isEmpty(ossFileList)) { + return "没有需要处理的文件"; + } + // 筛选出后缀为doc或docx的文件 + List docFileList = ossFileList.stream() + .filter(o -> o.getUrl().endsWith("doc") || o.getUrl().endsWith("docx")) + .collect(Collectors.toList()); + // 筛选出已经转换过的pdf文件 + Map> alreadyTransferFileMap = ossFileList.stream() + .filter(o -> StrUtil.isNotBlank(o.getBindId())) + .collect(Collectors.groupingBy(OSSFile::getBindId)); + for (OSSFile ossFile : docFileList){ + List existPdfFileList = alreadyTransferFileMap.get(ossFile.getId()); + // 已经转换过的不再重复转换 + if (CollUtil.isNotEmpty(existPdfFileList)) { + continue; + } + String docFileName = ossFile.getFileName(); + log.info("开始处理文件名为 {} 的文件转换工作", docFileName); + // 根据文件url获取文件 + InputStream isDecrypt; + try (InputStream is = MinioUtil.download(ossFile.getUrl())) { + isDecrypt = is; + // 文件解密 + if (enable) { + isDecrypt = IntekeyUtils.autoDecryptInputStreamFile(isDecrypt, ossFile.getFileName()); + } + // 转换为pdf + String pdfFileName = docFileName.substring(0, docFileName.lastIndexOf(".")); + String targetPath = "convert/" + ossFile.getFileName(); + File targetFile = new File(filePath + targetPath); + try (OutputStream outputStream = Files.newOutputStream(targetFile.toPath())) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = isDecrypt.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + } catch (IOException e) { + log.error("文件写入失败:" + e.getMessage()); + } + onlyOfficePdfUtil.convertAndSavePdfFile(pdfFileName, ossFile.getId(), targetPath); + // 将下载到本地的文件删除 + FileUtil.del(targetFile); + log.info("文件名为 {} 的文件转换成功", docFileName); + resultList.add(ossFile); + } catch (Exception e) { + log.error("文件名为 {} 的文件转换失败,失败原因{}", docFileName, e.getMessage()); + } + } + return "文件转换完成,需要转换的文件数量为: " + ossFileList.size() + "成功转换数量为: " + resultList.size(); + } + + +} diff --git a/laws-modules/src/main/java/com/jero/modules/onlyoffice/service/impl/BusProcessModelHisServiceImpl.java b/laws-modules/src/main/java/com/jero/modules/onlyoffice/service/impl/BusProcessModelHisServiceImpl.java index 627bfe28..13912a55 100644 --- a/laws-modules/src/main/java/com/jero/modules/onlyoffice/service/impl/BusProcessModelHisServiceImpl.java +++ b/laws-modules/src/main/java/com/jero/modules/onlyoffice/service/impl/BusProcessModelHisServiceImpl.java @@ -427,7 +427,7 @@ public class BusProcessModelHisServiceImpl extends ServiceImpl lambdaQueryWrapper = new LambdaQueryWrapper<>(); diff --git a/laws-single-startup/src/main/resources/application-dev.yml b/laws-single-startup/src/main/resources/application-dev.yml index eee3d6ba..89216f16 100644 --- a/laws-single-startup/src/main/resources/application-dev.yml +++ b/laws-single-startup/src/main/resources/application-dev.yml @@ -476,7 +476,7 @@ download: # 文件下载、预览拦截路径,多个以逗号分隔 download_url: /sys/common/download/ view_url: /sys/common/view/ - white_url: /lawsSpecialProjectLibrary/exportXls,/noEncryptDownload,/overseas/exportData,/overseas/exportDataWithFile,/overseas/templateDownload,/domestic/exportData,/domestic/exportDataWithFile,/domestic/templateDownload,/onlyOffice,/enterprise/templateDownload,/exportDataWithFile,/exportSplitInfoZip,/lawsCustomCompareInfo/exportExcel,/home/search/download,/documentSplit/downloadImportTemplate,/split/file/getImage + white_url: /lawsSpecialProjectLibrary/exportXls,/noEncryptDownload,/overseas/exportData,/overseas/exportDataWithFile,/overseas/templateDownload,/domestic/exportData,/domestic/exportDataWithFile,/domestic/templateDownload,/onlyOffice,/enterprise/templateDownload,/exportDataWithFile,/exportSplitInfoZip,/lawsCustomCompareInfo/exportExcel,/home/search/download,/documentSplit/downloadImportTemplate,/split/file/getImage,/allDocFileTransferPdf,/file/convert dev_encrypt_url: /devEncryptDownload,/enterprise/exportData # 管理员角色 admin_role_code: admin,BZGLY