huangjn 2 rokov pred
rodič
commit
3651302330
15 zmenil súbory, kde vykonal 778 pridanie a 185 odobranie
  1. 46 0
      blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java
  2. 19 0
      blade-common/src/main/java/org/springblade/common/vo/DataVO.java
  3. 26 0
      blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/CommonFileClient.java
  4. 19 0
      blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/vo/ToPdfVO.java
  5. 142 143
      blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/OssEndpoint.java
  6. 171 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/CommonFileClientImpl.java
  7. 2 2
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ImageClassificationFile.java
  8. 21 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClient.java
  9. 10 0
      blade-service/blade-business/pom.xml
  10. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/DefaultConfigController.java
  11. 141 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java
  12. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml
  13. 4 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml
  14. 157 38
      blade-service/blade-business/src/main/java/org/springblade/business/utils/FileUtils.java
  15. 18 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java

+ 46 - 0
blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java

@@ -7,8 +7,12 @@ import java.math.BigDecimal;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Random;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 /**
  * 通用工具类
@@ -17,6 +21,48 @@ import java.util.Random;
  */
 public class CommonUtil {
 
+    public static String handleNull(Object obj) {
+        if (null == obj) {
+            return "";
+        } else {
+            return obj.toString().trim();
+        }
+    }
+
+    public static String join(Object ...args){
+        if(args!=null){
+            if(args.length>2){
+                List<String> list = Arrays.stream(args).limit(args.length - 1).map(CommonUtil::handleNull).collect(Collectors.toList());
+                String split=handleNull(args[args.length-1]);
+                return join(list, split);
+            }else{
+                return handleNull(args[0]);
+            }
+        }else {
+            return "";
+        }
+    }
+
+    public static String join(List<String>list, String split){
+        StringBuilder sb = new StringBuilder();
+        if(list != null && list.size() > 0){
+            for(String str:list){
+                if(StringUtils.isNotEmpty(str)){
+                    sb.append(str).append(split);
+                }
+            }
+            if(sb.length()>0 && StringUtils.isNotEmpty(split)){
+                sb.delete(sb.length() - split.length(), sb.length());
+            }
+        }
+        return sb.toString();
+    }
+
+    public static Matcher matcher(String regex, String value) {
+        Pattern pattern = Pattern.compile(regex);
+        return pattern.matcher(value);
+    }
+
     /**
      * 根据OSS文件路径获取文件输入流
      */

+ 19 - 0
blade-common/src/main/java/org/springblade/common/vo/DataVO.java

@@ -0,0 +1,19 @@
+package org.springblade.common.vo;
+
+import lombok.Data;
+
+@Data
+public class DataVO {
+
+    private Integer x;
+
+    private Integer y;
+
+    public DataVO(Integer x, Integer y){
+        this.x = x;
+        this.y = y;
+    }
+
+    public DataVO(){}
+
+}

+ 26 - 0
blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/CommonFileClient.java

@@ -0,0 +1,26 @@
+package org.springblade.resource.feign;
+
+import org.springblade.core.launch.constant.AppConstant;
+import org.springblade.resource.vo.NewBladeFile;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.multipart.MultipartFile;
+
+@FeignClient(
+        value = AppConstant.APPLICATION_RESOURCE_NAME
+)
+public interface CommonFileClient {
+
+    String API_PREFIX = "/CommonFileApi";
+
+    @PostMapping(value = API_PREFIX + "/pngOrJpgToPdf", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    NewBladeFile pngOrJpgToPdf(MultipartFile file);
+
+    @PostMapping(value = API_PREFIX + "/wordToPdf", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    NewBladeFile wordToPdf(MultipartFile file);
+
+    @PostMapping(value = API_PREFIX + "/excelToPdf", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    NewBladeFile excelToPdf(MultipartFile file);
+
+}

+ 19 - 0
blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/vo/ToPdfVO.java

@@ -0,0 +1,19 @@
+package org.springblade.resource.vo;
+
+import lombok.Data;
+
+@Data
+public class ToPdfVO {
+
+    private String originalFilename;
+
+    private Object file;
+
+    public ToPdfVO(String originalFilename, Object file){
+        this.originalFilename = originalFilename;
+        this.file = file;
+    }
+
+    public ToPdfVO(){}
+
+}

+ 142 - 143
blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/OssEndpoint.java

@@ -37,8 +37,10 @@ import org.springblade.core.tool.utils.FileUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.resource.builder.oss.OssBuilder;
 import org.springblade.resource.entity.Attach;
+import org.springblade.resource.feign.CommonFileClient;
 import org.springblade.resource.service.IAttachService;
 import org.springblade.resource.vo.NewBladeFile;
+import org.springblade.resource.vo.ToPdfVO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -67,6 +69,8 @@ public class OssEndpoint {
 	 */
 	private final IAttachService attachService;
 
+	private final CommonFileClient commonFileClient;
+
 	/**
 	 * 创建存储桶
 	 *
@@ -183,23 +187,18 @@ public class OssEndpoint {
 		BladeFile bladeFile = ossBuilder.template().putFile(file.getOriginalFilename(), file.getInputStream());
 
 		//处理PDF文件
-		String originalFilename = "";
 		NewBladeFile newBladeFile = new NewBladeFile();
 		if(Objects.requireNonNull(file.getOriginalFilename()).contains("xlsx")){
-			originalFilename = file.getOriginalFilename().replaceAll(".xlsx", ".pdf");
-			newBladeFile = this.excelToPdf(originalFilename, file.getInputStream());
+			newBladeFile = this.commonFileClient.excelToPdf(file);
 
 		} else if(file.getOriginalFilename().contains("xls")){
-			originalFilename = file.getOriginalFilename().replaceAll(".xls", ".pdf");
-			newBladeFile = this.excelToPdf(originalFilename, file.getInputStream());
+			newBladeFile = this.commonFileClient.excelToPdf(file);
 
 		} else if(file.getOriginalFilename().contains("docx")){
-			originalFilename = file.getOriginalFilename().replaceAll(".docx", ".pdf");
-			newBladeFile = this.wordToPdf(originalFilename, file.getInputStream());
+			newBladeFile = this.commonFileClient.wordToPdf(file);
 
 		} else if(file.getOriginalFilename().contains("png") || file.getOriginalFilename().contains("jpg")){
-			originalFilename = file.getOriginalFilename().replaceAll(".png", ".pdf").replaceAll(".jpg", ".pdf");
-			newBladeFile = this.pngOrJpgToPdf(originalFilename, file.getInputStream());
+			newBladeFile = this.commonFileClient.pngOrJpgToPdf(file);
 
 		} else if(file.getOriginalFilename().contains("pdf")){
 			//获取PDF文件
@@ -214,140 +213,140 @@ public class OssEndpoint {
 		return R.data(newBladeFile);
 	}
 
-	/**
-	 * png 和 jpg 转 pdf
-	 * @param originalFilename 文件名称
-	 * @param is 文件输入流
-	 * @return 上传结果对象
-	 */
-	private NewBladeFile pngOrJpgToPdf(String originalFilename, InputStream is){
-		String pdfFileUrl = "";
-		try{
-			com.itextpdf.text.Document document = new com.itextpdf.text.Document();
-			document.setMargins(0,0,0,0);
-			ByteArrayOutputStream bos = new ByteArrayOutputStream();
-			PdfWriter.getInstance(document, bos);
-			document.open();
-			Image image = Image.getInstance(this.InputStreamToBytes(is));
-			// 设置页面宽高与图片一致
-			document.setPageSize(new Rectangle(image.getScaledWidth(), image.getScaledHeight()));
-			// 图片居中(感觉没啥用)
-			image.setAlignment(Image.ALIGN_CENTER);
-			// 新建一页添加图片
-			document.newPage();
-			document.add(image);
-			document.close();
-
-			//上传文件
-			InputStream pdfInput = new ByteArrayInputStream(bos.toByteArray());
-			BladeFile bladeFile = this.ossBuilder.template().putFile(originalFilename,pdfInput);
-			pdfFileUrl = bladeFile.getLink();
-
-		}catch (Exception e){
-			e.printStackTrace();
-		}
-
-		NewBladeFile newBladeFile = new NewBladeFile();
-		newBladeFile.setPdfUrl(pdfFileUrl);
-		newBladeFile.setPage(1);
-
-		return newBladeFile;
-	}
-
-	/**
-	 * 获取字节数组
-	 */
-	private byte[] InputStreamToBytes(InputStream is) throws IOException {
-		BufferedInputStream bis = new BufferedInputStream(is);
-		ByteArrayOutputStream os = new ByteArrayOutputStream();
-		int date = -1;
-		while ((date = bis.read()) != -1) {
-			os.write(date);
-		}
-		return os.toByteArray();
-	}
-
-	/**
-	 * word 转 pdf
-	 * @param originalFilename 文件名称
-	 * @param is 文件输入流
-	 * @return 上传结果对象
-	 */
-	private NewBladeFile wordToPdf(String originalFilename, InputStream is){
-		String pdfFileUrl = "";
-		int page = 0;
-		try{
-			com.aspose.words.Document document = new com.aspose.words.Document(is);
-
-			DocumentBuilder documentBuilder = new DocumentBuilder(document);
-			com.aspose.words.Font font = documentBuilder.getFont();
-
-			font.setName("宋体");
-
-			ByteArrayOutputStream bos = new ByteArrayOutputStream();
-			document.save(bos,com.aspose.words.SaveFormat.PDF);
-
-			//上传文件
-			InputStream pdfInput = new ByteArrayInputStream(bos.toByteArray());
-			BladeFile bladeFile = this.ossBuilder.template().putFile(originalFilename,pdfInput);
-			pdfFileUrl = bladeFile.getLink();
-
-			//获取页数
-			page = document.getPageCount();
-
-		}catch (Exception e){
-			e.printStackTrace();
-		}
-		NewBladeFile newBladeFile = new NewBladeFile();
-		newBladeFile.setPdfUrl(pdfFileUrl);
-		newBladeFile.setPage(page);
-		return newBladeFile;
-	}
-
-	/**
-	 * excel 转 pdf
-	 * @param originalFilename 文件名称
-	 * @param is 文件输入流
-	 * @return 上传结果对象
-	 */
-	private NewBladeFile excelToPdf(String originalFilename, InputStream is){
-		String pdfFileUrl = "";
-		int page = 0;
-		try{
-			org.apache.poi.ss.usermodel.Workbook ss = WorkbookFactory.create(is);
-
-			for(int i = 0, l = ss.getNumberOfSheets(); i < l; i ++){
-				Sheet sheet = ss.getSheetAt(i);
-				//去掉表格虚线
-				sheet.setPrintGridlines(false);
-				//设置 整个工作表为一页
-				sheet.setFitToPage(true);
-			}
-
-			ByteArrayOutputStream outReport = new ByteArrayOutputStream();
-			ss.write(outReport);
-			com.aspose.cells.Workbook wb = new com.aspose.cells.Workbook(new ByteArrayInputStream(outReport.toByteArray()));
-
-			ByteArrayOutputStream bos = new ByteArrayOutputStream();
-			wb.save(bos, SaveFormat.PDF);
-			bos.flush();
-			//上传文件
-			InputStream pdfInput = new ByteArrayInputStream(bos.toByteArray());
-			BladeFile bladeFile = this.ossBuilder.template().putFile(originalFilename,pdfInput);
-			pdfFileUrl = bladeFile.getLink();
-
-			//获取页数
-			page = wb.getWorksheets().getActiveSheetIndex() + 1;
-
-			bos.close();
-		}catch (Exception e){
-			e.printStackTrace();
-		}
-		NewBladeFile newBladeFile = new NewBladeFile();
-		newBladeFile.setPdfUrl(pdfFileUrl);
-		newBladeFile.setPage(page);
-		return  newBladeFile;
-	}
+//	/**
+//	 * png 和 jpg 转 pdf
+//	 * @param originalFilename 文件名称
+//	 * @param is 文件输入流
+//	 * @return 上传结果对象
+//	 */
+//	private NewBladeFile pngOrJpgToPdf(String originalFilename, InputStream is){
+//		String pdfFileUrl = "";
+//		try{
+//			com.itextpdf.text.Document document = new com.itextpdf.text.Document();
+//			document.setMargins(0,0,0,0);
+//			ByteArrayOutputStream bos = new ByteArrayOutputStream();
+//			PdfWriter.getInstance(document, bos);
+//			document.open();
+//			Image image = Image.getInstance(this.InputStreamToBytes(is));
+//			// 设置页面宽高与图片一致
+//			document.setPageSize(new Rectangle(image.getScaledWidth(), image.getScaledHeight()));
+//			// 图片居中(感觉没啥用)
+//			image.setAlignment(Image.ALIGN_CENTER);
+//			// 新建一页添加图片
+//			document.newPage();
+//			document.add(image);
+//			document.close();
+//
+//			//上传文件
+//			InputStream pdfInput = new ByteArrayInputStream(bos.toByteArray());
+//			BladeFile bladeFile = this.ossBuilder.template().putFile(originalFilename,pdfInput);
+//			pdfFileUrl = bladeFile.getLink();
+//
+//		}catch (Exception e){
+//			e.printStackTrace();
+//		}
+//
+//		NewBladeFile newBladeFile = new NewBladeFile();
+//		newBladeFile.setPdfUrl(pdfFileUrl);
+//		newBladeFile.setPage(1);
+//
+//		return newBladeFile;
+//	}
+//
+//	/**
+//	 * 获取字节数组
+//	 */
+//	private byte[] InputStreamToBytes(InputStream is) throws IOException {
+//		BufferedInputStream bis = new BufferedInputStream(is);
+//		ByteArrayOutputStream os = new ByteArrayOutputStream();
+//		int date = -1;
+//		while ((date = bis.read()) != -1) {
+//			os.write(date);
+//		}
+//		return os.toByteArray();
+//	}
+
+//	/**
+//	 * word 转 pdf
+//	 * @param originalFilename 文件名称
+//	 * @param is 文件输入流
+//	 * @return 上传结果对象
+//	 */
+//	private NewBladeFile wordToPdf(String originalFilename, InputStream is){
+//		String pdfFileUrl = "";
+//		int page = 0;
+//		try{
+//			com.aspose.words.Document document = new com.aspose.words.Document(is);
+//
+//			DocumentBuilder documentBuilder = new DocumentBuilder(document);
+//			com.aspose.words.Font font = documentBuilder.getFont();
+//
+//			font.setName("宋体");
+//
+//			ByteArrayOutputStream bos = new ByteArrayOutputStream();
+//			document.save(bos,com.aspose.words.SaveFormat.PDF);
+//
+//			//上传文件
+//			InputStream pdfInput = new ByteArrayInputStream(bos.toByteArray());
+//			BladeFile bladeFile = this.ossBuilder.template().putFile(originalFilename,pdfInput);
+//			pdfFileUrl = bladeFile.getLink();
+//
+//			//获取页数
+//			page = document.getPageCount();
+//
+//		}catch (Exception e){
+//			e.printStackTrace();
+//		}
+//		NewBladeFile newBladeFile = new NewBladeFile();
+//		newBladeFile.setPdfUrl(pdfFileUrl);
+//		newBladeFile.setPage(page);
+//		return newBladeFile;
+//	}
+
+//	/**
+//	 * excel 转 pdf
+//	 * @param originalFilename 文件名称
+//	 * @param is 文件输入流
+//	 * @return 上传结果对象
+//	 */
+//	private NewBladeFile excelToPdf(String originalFilename, InputStream is){
+//		String pdfFileUrl = "";
+//		int page = 0;
+//		try{
+//			org.apache.poi.ss.usermodel.Workbook ss = WorkbookFactory.create(is);
+//
+//			for(int i = 0, l = ss.getNumberOfSheets(); i < l; i ++){
+//				Sheet sheet = ss.getSheetAt(i);
+//				//去掉表格虚线
+//				sheet.setPrintGridlines(false);
+//				//设置 整个工作表为一页
+//				sheet.setFitToPage(true);
+//			}
+//
+//			ByteArrayOutputStream outReport = new ByteArrayOutputStream();
+//			ss.write(outReport);
+//			com.aspose.cells.Workbook wb = new com.aspose.cells.Workbook(new ByteArrayInputStream(outReport.toByteArray()));
+//
+//			ByteArrayOutputStream bos = new ByteArrayOutputStream();
+//			wb.save(bos, SaveFormat.PDF);
+//			bos.flush();
+//			//上传文件
+//			InputStream pdfInput = new ByteArrayInputStream(bos.toByteArray());
+//			BladeFile bladeFile = this.ossBuilder.template().putFile(originalFilename,pdfInput);
+//			pdfFileUrl = bladeFile.getLink();
+//
+//			//获取页数
+//			page = wb.getWorksheets().getActiveSheetIndex() + 1;
+//
+//			bos.close();
+//		}catch (Exception e){
+//			e.printStackTrace();
+//		}
+//		NewBladeFile newBladeFile = new NewBladeFile();
+//		newBladeFile.setPdfUrl(pdfFileUrl);
+//		newBladeFile.setPage(page);
+//		return  newBladeFile;
+//	}
 
 	/**
 	 * 上传文件

+ 171 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/CommonFileClientImpl.java

@@ -0,0 +1,171 @@
+package org.springblade.resource.feign;
+
+import com.aspose.cells.SaveFormat;
+import com.aspose.words.DocumentBuilder;
+import com.itextpdf.text.Image;
+import com.itextpdf.text.Rectangle;
+import com.itextpdf.text.pdf.PdfWriter;
+import lombok.AllArgsConstructor;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
+import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.resource.builder.oss.OssBuilder;
+import org.springblade.resource.vo.NewBladeFile;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.util.Objects;
+
+@NonDS
+@RestController
+@AllArgsConstructor
+public class CommonFileClientImpl implements CommonFileClient {
+
+    /**
+     * 对象存储构建类
+     */
+    private final OssBuilder ossBuilder;
+
+    /**
+     * png 和 jpg 转 pdf
+     */
+    @Override
+    public NewBladeFile pngOrJpgToPdf(MultipartFile file){
+        String pdfFileUrl = "";
+        try{
+            com.itextpdf.text.Document document = new com.itextpdf.text.Document();
+            document.setMargins(0,0,0,0);
+            ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            PdfWriter.getInstance(document, bos);
+            document.open();
+            Image image = Image.getInstance(this.InputStreamToBytes(file.getInputStream()));
+            // 设置页面宽高与图片一致
+            document.setPageSize(new Rectangle(image.getScaledWidth(), image.getScaledHeight()));
+            // 图片居中(感觉没啥用)
+            image.setAlignment(Image.ALIGN_CENTER);
+            // 新建一页添加图片
+            document.newPage();
+            document.add(image);
+            document.close();
+
+            //上传文件
+            InputStream pdfInput = new ByteArrayInputStream(bos.toByteArray());
+            String originalFilename = Objects.requireNonNull(file.getOriginalFilename()).replaceAll(".png", ".pdf").replaceAll(".jpg", ".pdf");
+
+            BladeFile bladeFile = this.ossBuilder.template().putFile(originalFilename,pdfInput);
+            pdfFileUrl = bladeFile.getLink();
+
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
+        NewBladeFile newBladeFile = new NewBladeFile();
+        newBladeFile.setPdfUrl(pdfFileUrl);
+        newBladeFile.setPage(1);
+
+        return newBladeFile;
+    }
+
+    /**
+     * 获取字节数组
+     */
+    private byte[] InputStreamToBytes(InputStream is) throws IOException {
+        BufferedInputStream bis = new BufferedInputStream(is);
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        int date;
+        while ((date = bis.read()) != -1) {
+            os.write(date);
+        }
+        return os.toByteArray();
+    }
+
+    /**
+     * word 转 pdf
+     */
+    @Override
+    public NewBladeFile wordToPdf(MultipartFile file){
+        String pdfFileUrl = "";
+        int page = 0;
+        try{
+            com.aspose.words.Document document = new com.aspose.words.Document(file.getInputStream());
+
+            DocumentBuilder documentBuilder = new DocumentBuilder(document);
+            com.aspose.words.Font font = documentBuilder.getFont();
+
+            font.setName("宋体");
+
+            ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            document.save(bos,com.aspose.words.SaveFormat.PDF);
+
+            //上传文件
+            InputStream pdfInput = new ByteArrayInputStream(bos.toByteArray());
+            String originalFilename = Objects.requireNonNull(file.getOriginalFilename()).replaceAll(".docx", ".pdf");
+
+            BladeFile bladeFile = this.ossBuilder.template().putFile(originalFilename,pdfInput);
+            pdfFileUrl = bladeFile.getLink();
+
+            //获取页数
+            page = document.getPageCount();
+
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        NewBladeFile newBladeFile = new NewBladeFile();
+        newBladeFile.setPdfUrl(pdfFileUrl);
+        newBladeFile.setPage(page);
+        return newBladeFile;
+    }
+
+    /**
+     * excel 转 pdf
+     */
+    @Override
+    public NewBladeFile excelToPdf(MultipartFile file){
+        String pdfFileUrl = "";
+        int page = 0;
+        try{
+            org.apache.poi.ss.usermodel.Workbook ss = WorkbookFactory.create(file.getInputStream());
+
+            for(int i = 0, l = ss.getNumberOfSheets(); i < l; i ++){
+                Sheet sheet = ss.getSheetAt(i);
+                //去掉表格虚线
+                sheet.setPrintGridlines(false);
+                //设置 整个工作表为一页
+                sheet.setFitToPage(true);
+            }
+
+            ByteArrayOutputStream outReport = new ByteArrayOutputStream();
+            ss.write(outReport);
+            com.aspose.cells.Workbook wb = new com.aspose.cells.Workbook(new ByteArrayInputStream(outReport.toByteArray()));
+
+            ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            wb.save(bos, SaveFormat.PDF);
+            bos.flush();
+            //上传文件
+            InputStream pdfInput = new ByteArrayInputStream(bos.toByteArray());
+
+            String originalFilename;
+            if(Objects.requireNonNull(file.getOriginalFilename()).contains("xlsx")){
+                originalFilename = file.getOriginalFilename().replaceAll(".xlsx", ".pdf");
+            } else {
+                originalFilename = file.getOriginalFilename().replaceAll(".xls", ".pdf");
+            }
+
+            BladeFile bladeFile = this.ossBuilder.template().putFile(originalFilename, pdfInput);
+            pdfFileUrl = bladeFile.getLink();
+
+            //获取页数
+            page = wb.getWorksheets().getActiveSheetIndex() + 1;
+
+            bos.close();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        NewBladeFile newBladeFile = new NewBladeFile();
+        newBladeFile.setPdfUrl(pdfFileUrl);
+        newBladeFile.setPage(page);
+        return  newBladeFile;
+    }
+}

+ 2 - 2
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ImageClassificationFile.java

@@ -17,8 +17,6 @@
 package org.springblade.business.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
-
-import java.io.Serializable;
 import java.time.LocalDateTime;
 
 import io.swagger.annotations.ApiModelProperty;
@@ -125,5 +123,7 @@ public class ImageClassificationFile extends BaseEntity {
     @ApiModelProperty("文字说明")
     private String textContent;
 
+    @ApiModelProperty("合并后的PDF")
+    private String margePdfUrl;
 
 }

+ 21 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClient.java

@@ -0,0 +1,21 @@
+package org.springblade.manager.feign;
+
+import org.springblade.manager.entity.ExcelTab;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import static org.springblade.core.launch.constant.AppConstant.APPLICATION_NAME_PREFIX;
+
+@FeignClient(value = APPLICATION_NAME_PREFIX + "manager")
+public interface ExcelTabClient {
+
+    /**
+     * 接口前缀
+     */
+    String API_PREFIX = "/api/manager/excelTab";
+
+    @PostMapping(API_PREFIX + "/getById")
+    ExcelTab getById(@RequestParam String id);
+
+}

+ 10 - 0
blade-service/blade-business/pom.xml

@@ -76,6 +76,16 @@
             <version>2.9.1.RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itextpdf</artifactId>
+            <version>5.5.13</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/DefaultConfigController.java

@@ -61,7 +61,7 @@ public class DefaultConfigController extends BladeController {
 			if(StringUtils.isNotEmpty(newConfig.getTheme())){
 				oldConfig.setTheme(newConfig.getTheme());
 			}
-			newConfig.setOpinionView(newConfig.getOpinionView());
+			oldConfig.setOpinionView(newConfig.getOpinionView());
 			return R.data(this.defaultConfigService.updateById(oldConfig));
 		}
 

+ 141 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java

@@ -10,29 +10,48 @@ import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 import javax.validation.Valid;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.util.IOUtils;
 import org.springblade.business.entity.ImageClassificationShow;
 import org.springblade.business.service.ImageClassificationShowService;
+import org.springblade.business.utils.FileUtils;
 import org.springblade.business.vo.ImageClassificationShowVO;
 import org.springblade.business.vo.TreeVo;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.common.vo.DataVO;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.entity.ExcelTab;
 import org.springblade.manager.entity.ImageClassificationConfig;
+import org.springblade.manager.feign.ExcelTabClient;
 import org.springblade.manager.feign.ImageClassificationConfigClient;
 import org.springblade.manager.feign.WbsTreeContractClient;
 import org.springblade.manager.vo.ImageClassificationConfigVO;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
+import org.springblade.resource.feign.CommonFileClient;
+import org.springblade.resource.feign.NewIOSSClient;
+import org.springblade.resource.vo.NewBladeFile;
 import org.springblade.system.entity.Dict;
 import org.springblade.system.feign.IDictClient;
 import org.springframework.beans.BeanUtils;
+import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springblade.business.entity.ImageClassificationFile;
 import org.springblade.business.vo.ImageClassificationFileVO;
 import org.springblade.business.service.IImageClassificationFileService;
 import org.springblade.core.boot.ctrl.BladeController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
 import java.util.*;
 
 /**
@@ -60,6 +79,128 @@ public class ImageClassificationFileController extends BladeController {
 
 	private final IDictClient dictClient;
 
+	private final ExcelTabClient excelTabClient;
+
+	private final CommonFileClient commonFileClient;
+
+	private final NewIOSSClient newIOSSClient;
+
+	/**
+	 * 影音资料览(图片)
+	 */
+	@PostMapping("/preview")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "影音资料览(图片)")
+	public R<String> preview(@RequestParam String ids){
+		//获取固定表格
+		ExcelTab excelTab = this.excelTabClient.getById("1548845687369334785");
+
+		List<String> result = new ArrayList<>();
+		if(excelTab != null){
+			//获取数据
+			List<ImageClassificationFile> fileResult = this.imageClassificationFileService.list(Wrappers.<ImageClassificationFile>lambdaQuery().in(ImageClassificationFile::getId, Arrays.asList(ids.split(","))));
+
+			try{
+				if(fileResult != null && fileResult.size() > 0){
+
+					for(ImageClassificationFile file : fileResult){
+						//获取图片文件流
+						String[] uris = file.getImageUrl().split(",");
+						//处理多个文件
+						if(uris.length > 0){
+							//获取模板文件流
+							InputStream modInput = null;
+							FileOutputStream outputStream = null;
+
+							List<String> pdfFileList = new ArrayList<>();
+							//每个图片就是一个文件
+							for(String uri : uris){
+								try{
+									//创建模板Workbook
+									modInput = CommonUtil.getOSSInputStream(excelTab.getFileUrl());
+									Workbook workbook = WorkbookFactory.create(modInput);
+									CreationHelper helper = workbook.getCreationHelper();
+									Sheet sheet = workbook.getSheetAt(0);
+									Drawing<?> drawing = sheet.createDrawingPatriarch();
+									ClientAnchor anchor = helper.createClientAnchor();
+									anchor.setRow1(0);
+									anchor.setCol1(0);
+
+									//创建图片
+									drawing.createPicture(anchor, workbook.addPicture(FileUtils.InputStreamToBytes(CommonUtil.getOSSInputStream(uri)), Workbook.PICTURE_TYPE_PNG));
+									//图片定位
+									FileUtils.imageOrientation(sheet, anchor, new DataVO(0, 0));
+
+									//定位其它信息
+									//文字说明
+									sheet.getRow(1).getCell(6).setCellValue(file.getTextContent());
+									//照片号
+									sheet.getRow(20).getCell(6).setCellValue(file.getPhotoCode());
+									//底片号
+									sheet.getRow(24).getCell(6).setCellValue(file.getFilmCode());
+									//题名
+									sheet.getRow(28).getCell(0).setCellValue(file.getTitle());
+									//参见号
+									sheet.getRow(28).getCell(4).setCellValue(file.getSeeAlsoCode());
+									//拍摄时间
+									sheet.getRow(30).getCell(4).setCellValue(DateUtil.format(file.getShootingTime(), "yyyy-MM-dd HH:mm:ss"));
+									//参见号
+									sheet.getRow(32).getCell(4).setCellValue(file.getShootingUser());
+
+									String locationFile = "D:\\project\\file\\" + SnowFlakeUtil.getId() + ".xlsx";
+									outputStream = new FileOutputStream(locationFile);
+
+									//生成一份新的excel
+									workbook.write(outputStream);
+									//将excel转PDF
+									File excelFile = new File(locationFile);
+									MultipartFile files = new MockMultipartFile("file", excelFile.getName(), "text/plain", IOUtils.toByteArray(new FileInputStream(excelFile)));
+									NewBladeFile bladeFile = this.commonFileClient.excelToPdf(files);
+									if(bladeFile != null){
+										pdfFileList.add(bladeFile.getPdfUrl());
+									}
+									outputStream.close();
+									modInput.close();
+								}catch (Exception e){
+									e.printStackTrace();
+								} finally {
+									if(modInput != null){
+										modInput.close();
+									}
+									if(outputStream != null){
+										outputStream.close();
+									}
+								}
+							}
+
+							//合并pdf并上传
+							String mergeName = SnowFlakeUtil.getId() + ".pdf";
+							if(StringUtils.isNotEmpty(file.getMargePdfUrl())){
+								String[] urls = file.getMargePdfUrl().split("/");
+								mergeName = urls[urls.length - 1];
+							}
+							String mergeUrl = "D:\\project\\file\\" + mergeName;
+							FileUtils.mergePdfPublicMethods(pdfFileList, mergeUrl);
+							//上传
+							BladeFile bladeFile = this.newIOSSClient.uploadFile(mergeName, mergeUrl);
+							if(bladeFile != null){
+								result.add(bladeFile.getLink());
+								if(StringUtils.isEmpty(file.getMargePdfUrl())){
+									file.setMargePdfUrl(bladeFile.getLink());
+									this.imageClassificationFileService.update(Wrappers.<ImageClassificationFile>lambdaUpdate().set(ImageClassificationFile::getMargePdfUrl, bladeFile.getLink()).eq(ImageClassificationFile::getId, file.getId().toString()));
+								}
+							}
+						}
+					}
+				}
+			}catch (Exception e){
+				e.printStackTrace();
+			}
+		}
+		//暂时没有多选,返回第一个
+		return result.size() > 0 ? R.data(result.get(0)) : R.data(null);
+	}
+
 	/**
 	 * 获取当前合同段的工程划分
 	 * @param parentId 父节点,为空则查询第一级节点

+ 1 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml

@@ -93,6 +93,7 @@
                 cite_change_number like concat('%',#{vo.queryValue},'%')
             )
         </if>
+        order by create_time DESC
     </select>
 
 </mapper>

+ 4 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ImageClassificationFileMapper.xml

@@ -29,6 +29,7 @@
         <result column="see_also_code" property="seeAlsoCode"/>
         <result column="text_content" property="textContent"/>
         <result column="pdf_url" property="pdfUrl"/>
+        <result column="marge_pdf_url" property="margePdfUrl"/>
     </resultMap>
 
     <select id="queryCurrentClassifyAllFileCount" resultType="java.lang.Integer">
@@ -56,7 +57,8 @@
             files.file_size,
             files.image_url,
             files.pdf_url,
-            files.type
+            files.type,
+            files.marge_pdf_url
         from
         (
             select
@@ -68,6 +70,7 @@
                 file_size,
                 image_url,
                 pdf_url,
+                marge_pdf_url,
                 type,
                 date_format(shooting_time,'%Y-%m-%d') as shootingTimeStr
             from u_image_classification_file where is_deleted = 0

+ 157 - 38
blade-service/blade-business/src/main/java/org/springblade/business/utils/FileUtils.java

@@ -1,51 +1,170 @@
 package org.springblade.business.utils;
 
+import com.itextpdf.text.Document;
+import com.itextpdf.text.pdf.PdfCopy;
+import com.itextpdf.text.pdf.PdfReader;
+import org.apache.poi.ss.usermodel.ClientAnchor;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.util.Units;
+import org.springblade.common.utils.CommonUtil;
+import org.springblade.common.vo.DataVO;
+
+import java.io.*;
+import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
 
 public class FileUtils {
 
+    public Map<String,Integer> getDxDy(Sheet sheet, ClientAnchor anchor){
+        Map<String,Integer> map = new HashMap<>();
+        if(sheet != null && anchor != null){
+            /*左上角单元格坐标*/
+            final int x1=anchor.getCol1();
+            final int y1=anchor.getRow1();
+            /*相对位移像素*/
+            final int dx1= Units.pointsToPixel(Units.toPoints(anchor.getDx1()));
+            final int dy1= Units.pointsToPixel(Units.toPoints(anchor.getDy1()));
+            int sum1=0;
+            for(int i=0;i<x1;i++){
+                sum1+=sheet.getColumnWidthInPixels(i)+8;
+            }
+            sum1+=dx1;
+            map.put("x1",sum1);
+            int sum2=0;
+            for(int i=0;i<y1;i++){
+                sum2+=Units.pointsToPixel(sheet.getRow(i).getHeightInPoints());
+            }
+            sum2+=dy1;
+            map.put("y1",sum2);
+            /*右下角单元格坐标*/
+            final int x2=anchor.getCol2();
+            final int y2=anchor.getRow2();
+            /*相对位移像素*/
+            final int dx2= Units.pointsToPixel(Units.toPoints(anchor.getDx2()));
+            final int dy2= Units.pointsToPixel(Units.toPoints(anchor.getDy2()));
+            int sum3=0;
+            for(int i=0;i<x2;i++){
+                sum3+=sheet.getColumnWidthInPixels(i)+8;
+            }
+            sum3+=dx2;
+            map.put("x2",sum3);
+            int sum4=0;
+            for(int i=0;i<y2;i++){
+                sum4+=Units.pointsToPixel(sheet.getRow(i).getHeightInPoints());
+            }
+            sum4+=dy2;
+            map.put("y2",sum4);
+        }
+        return map;
+    }
+
+    /**
+     * 图片定位
+     */
+    public static void imageOrientation(Sheet sheet, ClientAnchor anchor, DataVO dataVO) {
+        anchor.setDx1(Units.pixelToEMU(5));
+        anchor.setDy1(Units.pixelToEMU(5));
+        anchor.setCol2(anchor.getCol1());
+        anchor.setRow2(anchor.getRow1());
+        int k = getMergedRegionIndex(sheet, CommonUtil.join(dataVO.getX(), dataVO.getY(), dataVO.getX(), dataVO.getY(),","));
+        if(k>-1){
+            /*如果是合并单元格,则锚点第二坐标设置为合并区右下角单元格坐标*/
+            CellRangeAddress ca = sheet.getMergedRegion(k);
+            anchor.setCol1(ca.getFirstColumn());
+            anchor.setRow1(ca.getFirstRow());
+            anchor.setCol2(ca.getLastColumn());
+            anchor.setRow2(ca.getLastRow());
+        }
+        int dx=(int)(sheet.getColumnWidthInPixels(anchor.getCol2())+3);
+        int dy=Units.pointsToPixel(sheet.getRow(anchor.getRow2()).getHeightInPoints())-5;
+        anchor.setDx2(Units.pixelToEMU(dx));
+        anchor.setDy2(Units.pixelToEMU(dy));
+    }
+
+    public static int getMergedRegionIndex(Sheet sheet, String coords) {
+        for (int i = 0; i < sheet.getNumMergedRegions(); i++) {
+            CellRangeAddress ca = sheet.getMergedRegion(i);
+            int firstColumn = ca.getFirstColumn();
+            int lastColumn = ca.getLastColumn();
+            int firstRow = ca.getFirstRow();
+            int lastRow = ca.getLastRow();
+            Matcher mu = CommonUtil.matcher("(\\d{1,3}),(\\d{1,3}),(\\d{1,3}),(\\d{1,3})",coords);
+            /*合并单元格四个角坐标,只要任意一个在落在将要合并的区域里面意味着两者重合,就必须拆分前者*/
+            List<Integer[]> corners = Arrays.asList(new Integer[]{firstColumn,firstRow},new Integer[]{lastColumn,firstRow},new Integer[]{firstColumn,lastRow},new Integer[]{lastColumn,lastRow});
+            if(mu.find()){
+                int firstColumn2 = mu.group(1) == null ? 0 : Integer.parseInt(mu.group(1));
+                int lastColumn2 = mu.group(3) == null ? 0 : Integer.parseInt(mu.group(3));
+                int firstRow2 = mu.group(2) == null ? 0 : Integer.parseInt(mu.group(2));
+                int lastRow2 = mu.group(4) == null ? 0 : Integer.parseInt(mu.group(4));
+                for(Integer[] corner:corners){
+                    if(firstColumn2<=corner[0]&&corner[0]<=lastColumn2&&firstRow2<=corner[1]&&corner[1]<=lastRow2){
+                        return i;
+                    }
+                }
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * 获取字节数组
+     */
+    public static byte[] InputStreamToBytes(InputStream is) throws IOException {
+        BufferedInputStream bis = new BufferedInputStream(is);
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        int date = -1;
+        while ((date = bis.read()) != -1) {
+            os.write(date);
+        }
+        return os.toByteArray();
+    }
+
     /**
      * 合并方法
      */
     public static void mergePdfPublicMethods(List<String> urlList, String localImgUrl){
-//        PdfReader reader = null;
-//
-//        Document doc = new Document();
-//        PdfCopy pdfCopy = null;
-//        try{
-//            pdfCopy = new PdfCopy(doc, new FileOutputStream(localImgUrl));
-//            int pageCount;
-//            doc.open();
-//
-//            for(String urlStr : urlList){
-//                try{
-//                    //获取OSS文件输入流
-//                    reader = new PdfReader(CommonUtil.getOSSInputStream(urlStr));
-//
-//                    pageCount = reader.getNumberOfPages();
-//
-//                    for(int i = 0; i < pageCount; ++i){
-//                        int is = i + 1;
-//                        pdfCopy.addPage(pdfCopy.getImportedPage(reader,is));
-//                    }
-//                }catch (Exception e){
-//                    e.printStackTrace();
-//                } finally {
-//                    if(reader != null){
-//                        reader.close();
-//                    }
-//                }
-//            }
-//
-//        }catch (Exception e){
-//            e.printStackTrace();
-//        } finally {
-//            if(pdfCopy != null){
-//                pdfCopy.flush();
-//                pdfCopy.close();
-//            }
-//            doc.close();
-//        }
+        PdfReader reader = null;
+
+        Document doc = new Document();
+        PdfCopy pdfCopy = null;
+        try{
+            pdfCopy = new PdfCopy(doc, new FileOutputStream(localImgUrl));
+            int pageCount;
+            doc.open();
+
+            for(String urlStr : urlList){
+                try{
+                    //获取OSS文件输入流
+                    reader = new PdfReader(CommonUtil.getOSSInputStream(urlStr));
+
+                    pageCount = reader.getNumberOfPages();
+
+                    for(int i = 0; i < pageCount; ++i){
+                        int is = i + 1;
+                        pdfCopy.addPage(pdfCopy.getImportedPage(reader,is));
+                    }
+                }catch (Exception e){
+                    e.printStackTrace();
+                } finally {
+                    if(reader != null){
+                        reader.close();
+                    }
+                }
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+        } finally {
+            if(pdfCopy != null){
+                pdfCopy.flush();
+                pdfCopy.close();
+            }
+            doc.close();
+        }
     }
 
 }

+ 18 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java

@@ -0,0 +1,18 @@
+package org.springblade.manager.feign;
+
+import lombok.AllArgsConstructor;
+import org.springblade.manager.entity.ExcelTab;
+import org.springblade.manager.service.IExcelTabService;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@AllArgsConstructor
+public class ExcelTabClientImpl implements ExcelTabClient {
+
+    private final IExcelTabService excelTabService;
+
+    @Override
+    public ExcelTab getById(String id) {
+        return this.excelTabService.getById(id);
+    }
+}