소스 검색

计量-中间计量申请草图文件压缩

qianxb 5 달 전
부모
커밋
72c97035c7

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

@@ -595,6 +595,71 @@ public class CommonUtil {
     }
 
 
+    /**
+     * 图片压缩
+     *
+     * @param imageData
+     * @return
+     * @throws IOException
+     * @throws ImageProcessingException
+     * @throws MetadataException
+     */
+    public static byte[] compressImage2(byte[] imageData) throws IOException {
+        // 缩放图像
+        String formatName = "JPEG";
+        ByteArrayInputStream bais = new ByteArrayInputStream(imageData);
+        BufferedImage originalImage = ImageIO.read(bais);
+        long sizeLimit = 102400; //358KB
+        int width = 768;
+        int height = 200;
+        Image scaledImage = originalImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
+        BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        resizedImage.getGraphics().drawImage(scaledImage, 0, 0, null);
+
+        // 压缩图像
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ImageIO.write(resizedImage, formatName, baos);
+
+        if (baos.size() <= sizeLimit) {
+            // 图片大小已经小于等于目标大小,直接返回原始数据
+            return baos.toByteArray();
+        }
+
+        float quality = 0.5f; // 初始化压缩质量
+        int retries = 10; // 最多尝试 10 次
+
+        while (baos.size() > sizeLimit && retries > 0) {
+            // 压缩图像并重新计算压缩质量
+            byte[] data = baos.toByteArray();
+            bais = new ByteArrayInputStream(data);
+            BufferedImage compressedImage = ImageIO.read(bais);
+            baos.reset();
+
+            ImageWriter writer = null;
+            Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(formatName);
+            if (writers.hasNext()) {
+                writer = writers.next();
+            } else {
+                throw new IllegalArgumentException("Unsupported image format: " + formatName);
+            }
+
+            ImageWriteParam writeParam = writer.getDefaultWriteParam();
+            writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+            writeParam.setCompressionQuality(quality);
+
+            writer.setOutput(ImageIO.createImageOutputStream(baos));
+            writer.write(null, new IIOImage(compressedImage, null, null), writeParam);
+            writer.dispose();
+
+            float ratio = sizeLimit * 1.0f / baos.size();
+            quality *= Math.sqrt(ratio);
+            retries--;
+        }
+
+        return baos.toByteArray();
+    }
+
+
     /**
      * 根据起止日期获取工作日
      * @return

+ 64 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/OssEndpoint.java

@@ -21,6 +21,8 @@ import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import org.apache.commons.lang.StringUtils;
 import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.poi.util.IOUtils;
+import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.oss.model.BladeFile;
@@ -198,6 +200,68 @@ public class OssEndpoint {
         return R.data(newBladeFile);
     }
 
+    /**
+     * 上传文件(兼容工程文件需求)
+     */
+    @SneakyThrows
+    @PostMapping("/upload-image-and-zip")
+    public  R<NewBladeFile> uploadImageAndZip(@RequestParam MultipartFile file) {
+        //处理PDF文件
+        NewBladeFile newBladeFile = new NewBladeFile();
+        if (Objects.requireNonNull(file.getOriginalFilename()).contains("xlsx")) {
+            newBladeFile = this.commonFileClient.excelToPdf(file);
+
+        } else if (file.getOriginalFilename().contains("xls")) {
+            newBladeFile = this.commonFileClient.excelToPdf(file);
+
+        } else if (file.getOriginalFilename().contains("docx")) {
+            newBladeFile = this.commonFileClient.wordToPdf(file);
+
+        } else if (file.getOriginalFilename().contains("png") || file.getOriginalFilename().contains("jpg")) {
+            newBladeFile = this.commonFileClient.pngOrJpgToPdf(file);
+
+        }else  if (file.getOriginalFilename().contains("pdf") || file.getOriginalFilename().contains("PDF")) {
+            newBladeFile.setPdfUrl("7");
+        }
+        if (newBladeFile == null || StringUtils.isBlank(newBladeFile.getPdfUrl())){
+            throw  new ServiceException("图片转换PDF失败");
+        }
+        long start1 = System.currentTimeMillis();
+        byte[] bytes = CommonUtil.compressImage2(IOUtils.toByteArray(file.getInputStream()));
+        long start2 = System.currentTimeMillis();
+        System.out.println(start2 - start1);
+        //上传原图
+        ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
+        BladeFile bladeFile = ossBuilder.template().putFile(file.getOriginalFilename(), inputStream);
+        if (file.getOriginalFilename().contains("pdf") || file.getOriginalFilename().contains("PDF")) {
+            //获取PDF文件
+            PDDocument document = PDDocument.load(file.getInputStream());
+            //获取文件页数
+            newBladeFile.setPage(document.getPages().getCount());
+            //pdf的路径就是文件上传的路径
+            newBladeFile.setPdfUrl(bladeFile.getLink());
+        }
+
+        BeanUtils.copyProperties(bladeFile, newBladeFile);
+        newBladeFile.setFileSize(file.getSize() / 1024);
+        newBladeFile.setFileSizeName(formatSize(file.getSize()));
+        newBladeFile.setFileDate(LocalDateTime.now());
+        newBladeFile.setFileSuffix(bladeFile.getOriginalName().substring(bladeFile.getOriginalName().lastIndexOf(".")+1));
+
+        //入库
+        String fileExtension = FileUtil.getFileExtension(bladeFile.getOriginalName());
+        Attach attach = new Attach();
+        attach.setDomainUrl(bladeFile.getDomain());
+        attach.setLink(newBladeFile.getPdfUrl());
+        attach.setName(bladeFile.getName());
+        attach.setOriginalName(bladeFile.getOriginalName());
+        attach.setAttachSize(newBladeFile.getFileSize());
+        attach.setExtension(fileExtension);
+        attachService.save(attach);
+
+        return R.data(newBladeFile);
+    }
+
     /**
      * 上传文件(兼容工程文件需求)
      */