Browse Source

fix:pdfA4 -> A3。

caozixuan 3 years ago
parent
commit
5197a27de4

+ 5 - 0
distributed-print-business/pom.xml

@@ -197,6 +197,11 @@
                 </exclusion>
                 </exclusion>
             </exclusions>
             </exclusions>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <version>5.2.12.RELEASE</version>
+        </dependency>
     </dependencies>
     </dependencies>
 
 
 </project>
 </project>

+ 27 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamTaskDetail.java

@@ -39,6 +39,7 @@ public class ExamTaskDetail extends BaseEntity implements Serializable {
 
 
     @TableField("draw_count")
     @TableField("draw_count")
     private Integer drawCount;
     private Integer drawCount;
+
     /**
     /**
      * [
      * [
      * {
      * {
@@ -53,6 +54,24 @@ public class ExamTaskDetail extends BaseEntity implements Serializable {
      * }
      * }
      * ]
      * ]
      */
      */
+    @ApiModelProperty(value = "原试卷附件")
+    @TableField("paper_original_attachment_ids")
+    private String paperOriginalAttachmentIds;
+    /**
+     * [
+     * {
+     * "type": "A",
+     * "attachmentId": 12,
+     * "totalPages": 3
+     * },
+     * {
+     * "type": "B",
+     * "attachmentId": 13,
+     * "totalPages": 2
+     * }
+     * ]
+     */
+    @ApiModelProperty(value = "转换后A3试卷附件")
     @TableField("paper_attachment_ids")
     @TableField("paper_attachment_ids")
     private String paperAttachmentIds;
     private String paperAttachmentIds;
     /**
     /**
@@ -217,4 +236,12 @@ public class ExamTaskDetail extends BaseEntity implements Serializable {
     public void setOperateType(String operateType) {
     public void setOperateType(String operateType) {
         this.operateType = operateType;
         this.operateType = operateType;
     }
     }
+
+    public String getPaperOriginalAttachmentIds() {
+        return paperOriginalAttachmentIds;
+    }
+
+    public void setPaperOriginalAttachmentIds(String paperOriginalAttachmentIds) {
+        this.paperOriginalAttachmentIds = paperOriginalAttachmentIds;
+    }
 }
 }

+ 1 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/PdfUtil.java

@@ -157,13 +157,11 @@ public class PdfUtil {
      * @throws IOException
      * @throws IOException
      */
      */
     public static PageSizeEnum getPdfFormat(File file) throws IOException {
     public static PageSizeEnum getPdfFormat(File file) throws IOException {
-
-
         Optional.ofNullable(file).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("文件不能为空"));
         Optional.ofNullable(file).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("文件不能为空"));
         PdfReader reader = new PdfReader(ByteArray.fromFile(file).value());
         PdfReader reader = new PdfReader(ByteArray.fromFile(file).value());
         int totalPages = reader.getNumberOfPages();
         int totalPages = reader.getNumberOfPages();
         PageSizeEnum pageSizeEnum = null;
         PageSizeEnum pageSizeEnum = null;
-        for (int i = 1;i < totalPages;i ++){
+        for (int i = 1;i <= totalPages;i ++){
             Rectangle pageSize = reader.getPageSize(i);
             Rectangle pageSize = reader.getPageSize(i);
             if (pageSizeEnum != null){
             if (pageSizeEnum != null){
                 if (!pageSizeEnum.equals(PageSizeEnum.convertToEnum(pageSize.getWidth(), pageSize.getHeight()))){
                 if (!pageSizeEnum.equals(PageSizeEnum.convertToEnum(pageSize.getWidth(), pageSize.getHeight()))){

+ 90 - 4
distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java

@@ -15,6 +15,7 @@ import com.qmth.distributed.print.business.service.BasicVerifyCodeService;
 import com.qmth.distributed.print.business.service.ExamPrintPlanService;
 import com.qmth.distributed.print.business.service.ExamPrintPlanService;
 import com.qmth.distributed.print.business.service.PrintCommonService;
 import com.qmth.distributed.print.business.service.PrintCommonService;
 import com.qmth.distributed.print.business.service.TBSyncTaskService;
 import com.qmth.distributed.print.business.service.TBSyncTaskService;
+import com.qmth.distributed.print.business.util.PdfUtil;
 import com.qmth.teachcloud.common.bean.auth.AuthBean;
 import com.qmth.teachcloud.common.bean.auth.AuthBean;
 import com.qmth.teachcloud.common.bean.result.LoginResult;
 import com.qmth.teachcloud.common.bean.result.LoginResult;
 import com.qmth.teachcloud.common.bean.result.UserLoginCheckResult;
 import com.qmth.teachcloud.common.bean.result.UserLoginCheckResult;
@@ -24,13 +25,15 @@ import com.qmth.teachcloud.common.entity.*;
 import com.qmth.teachcloud.common.enums.*;
 import com.qmth.teachcloud.common.enums.*;
 import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;
 import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.service.*;
-import com.qmth.teachcloud.common.util.Result;
-import com.qmth.teachcloud.common.util.ResultUtil;
-import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.common.util.*;
 import io.swagger.annotations.*;
 import io.swagger.annotations.*;
+import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.http.entity.ContentType;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.BindingResult;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
@@ -38,6 +41,10 @@ import org.springframework.web.multipart.MultipartFile;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import javax.validation.Valid;
 import javax.validation.Valid;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
 import java.security.NoSuchAlgorithmException;
 import java.security.NoSuchAlgorithmException;
 import java.util.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
@@ -102,6 +109,9 @@ public class SysController {
     @Resource
     @Resource
     BasicCampusService basicCampusService;
     BasicCampusService basicCampusService;
 
 
+    @Resource
+    FileStoreUtil fileStoreUtil;
+
     /**
     /**
      * 登录
      * 登录
      *
      *
@@ -247,7 +257,8 @@ public class SysController {
     }
     }
 
 
     @ApiOperation(value = "文件上传接口")
     @ApiOperation(value = "文件上传接口")
-    @RequestMapping(value = "/file/upload", method = RequestMethod.POST)
+    @RequestMapping(value = "/file/exam_paper_upload", method = RequestMethod.POST)
+//    @RequestMapping(value = "/file/upload", method = RequestMethod.POST)
     @Transactional
     @Transactional
     @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
     @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
     public Result fileUpload(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
     public Result fileUpload(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
@@ -272,6 +283,81 @@ public class SysController {
         return ResultUtil.ok(new EditResult(basicAttachment.getId(), teachcloudCommonService.filePreview(basicAttachment.getPath()), basicAttachment.getPages()));
         return ResultUtil.ok(new EditResult(basicAttachment.getId(), teachcloudCommonService.filePreview(basicAttachment.getPath()), basicAttachment.getPages()));
     }
     }
 
 
+    @ApiOperation(value = "考试试卷文件上传接口")
+//    @RequestMapping(value = "/file/exam_paper_upload", method = RequestMethod.POST)
+    @RequestMapping(value = "/file/upload", method = RequestMethod.POST)
+    @Transactional
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
+    public Result fileExamPaperUpload(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
+                             @ApiParam(value = "上传文件类型", required = true) @RequestParam UploadFileEnum type) {
+        Map<String,EditResult> resultMap = new HashMap<>();
+        BasicAttachment basicOriginalAttachment = null;
+        BasicAttachment basicTranslateAttachment = null;
+        EditResult original = new EditResult();
+        EditResult translate = new EditResult();
+        File localTempFile = null;
+        try {
+            File pdfOriginalFile = FileUtil.multipartFileToFile(file);
+            PageSizeEnum pageSizeEnum = PdfUtil.getPdfFormat(pdfOriginalFile);
+            switch (pageSizeEnum){
+                case A3:
+                    basicOriginalAttachment = printCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), type);
+                    if (Objects.isNull(basicOriginalAttachment)) {
+                        throw ExceptionResultEnum.ATTACHMENT_ERROR.exception();
+                    }
+                    original.setId(basicOriginalAttachment.getId());
+                    original.setUrl(teachcloudCommonService.filePreview(basicOriginalAttachment.getPath()));
+                    original.setPages(basicOriginalAttachment.getPages());
+
+                    BeanUtils.copyProperties(original,translate);
+                    break;
+                case A4:
+                    basicOriginalAttachment = printCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), type);
+                    if (Objects.isNull(basicOriginalAttachment)) {
+                        throw ExceptionResultEnum.ATTACHMENT_ERROR.exception();
+                    }
+                    original.setId(basicOriginalAttachment.getId());
+                    original.setUrl(teachcloudCommonService.filePreview(basicOriginalAttachment.getPath()));
+                    original.setPages(basicOriginalAttachment.getPages());
+
+                    String destUrl = SystemConstant.PDF_TEMP_FILES_DIR + File.separator + file.getOriginalFilename();
+                    localTempFile = new File(destUrl);
+                    OutputStream out = new FileOutputStream(localTempFile);
+                    PdfUtil.concatPDFs(new FileInputStream(pdfOriginalFile),out,false);
+                    // File转换成MutipartFile
+                    FileInputStream inputStream = new FileInputStream(localTempFile);
+                    MultipartFile multipartFile = new MockMultipartFile(localTempFile.getName(),localTempFile.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream);
+                    basicTranslateAttachment = printCommonService.saveAttachment(multipartFile, DigestUtils.md5Hex(multipartFile.getBytes()), type);
+                    translate.setId(basicTranslateAttachment.getId());
+                    translate.setUrl(teachcloudCommonService.filePreview(basicTranslateAttachment.getPath()));
+                    translate.setPages(basicTranslateAttachment.getPages());
+                    break;
+                default:
+                    throw ExceptionResultEnum.ERROR.exception("请上传A4或A3格式的试卷文件");
+            }
+            resultMap.put("original",original);
+            resultMap.put("translate",translate);
+        } catch (Exception e) {
+            log.error("请求出错", e);
+            if (Objects.nonNull(basicOriginalAttachment)) {
+                basicAttachmentService.deleteAttachment(basicOriginalAttachment);
+            }
+            if (Objects.nonNull(basicTranslateAttachment)) {
+                basicAttachmentService.deleteAttachment(basicTranslateAttachment);
+            }
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {
+            if (Objects.nonNull(localTempFile)){
+                FileUtil.deleteFile(localTempFile);
+            }
+        }
+        return ResultUtil.ok(resultMap);
+    }
+
     @ApiOperation(value = "文件下载接口")
     @ApiOperation(value = "文件下载接口")
     @RequestMapping(value = "/file/download", method = RequestMethod.POST)
     @RequestMapping(value = "/file/download", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
     @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})

+ 1 - 0
distributed-print/src/test/java/com/qmth/distributed/print/AuthHelpTest.java

@@ -10,6 +10,7 @@ import org.junit.runner.RunWith;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.test.context.junit4.SpringRunner;
 
 
+
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;

+ 1 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -87,6 +87,7 @@ public class SystemConstant {
     public static final String REGULAR_EXPRESSION_OF_PHONE = "((\\d{3,4})|(\\(\\d{3,4}\\)-))?\\d{7,8}";
     public static final String REGULAR_EXPRESSION_OF_PHONE = "((\\d{3,4})|(\\(\\d{3,4}\\)-))?\\d{7,8}";
     public static final String SYS_USER = "sysUser";
     public static final String SYS_USER = "sysUser";
     public static final List<Long> MENU_MANAGE = Arrays.asList(507L, 508L, 530L, 531L);
     public static final List<Long> MENU_MANAGE = Arrays.asList(507L, 508L, 530L, 531L);
+    public static final float PAPER_DEVIATION = 2;
 
 
     /**
     /**
      * oss url过期时间
      * oss url过期时间

+ 10 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/PageSizeEnum.java

@@ -1,5 +1,7 @@
 package com.qmth.teachcloud.common.enums;
 package com.qmth.teachcloud.common.enums;
 
 
+import com.qmth.teachcloud.common.contant.SystemConstant;
+
 /**
 /**
  * @Description: pdf格式 enum
  * @Description: pdf格式 enum
  * @Param:
  * @Param:
@@ -80,8 +82,11 @@ public enum PageSizeEnum {
      * @return
      * @return
      */
      */
     public static String convertToName(float width, float height) {
     public static String convertToName(float width, float height) {
+        float deviation = SystemConstant.PAPER_DEVIATION;
         for (PageSizeEnum e : PageSizeEnum.values()) {
         for (PageSizeEnum e : PageSizeEnum.values()) {
-            if (e.getWidth() == width && e.getHeight() == height) {
+            float standardWidth = e.getWidth();
+            float standardHeight = e.getHeight();
+            if (standardWidth - deviation <= width && width <= standardWidth + deviation && standardHeight - deviation <= height && height <= standardHeight + deviation){
                 return e.name();
                 return e.name();
             }
             }
         }
         }
@@ -96,8 +101,11 @@ public enum PageSizeEnum {
      * @return
      * @return
      */
      */
     public static PageSizeEnum convertToEnum(float width, float height) {
     public static PageSizeEnum convertToEnum(float width, float height) {
+        float deviation = SystemConstant.PAPER_DEVIATION;
         for (PageSizeEnum e : PageSizeEnum.values()) {
         for (PageSizeEnum e : PageSizeEnum.values()) {
-            if (e.getWidth() == width && e.getHeight() == height) {
+            float standardWidth = e.getWidth();
+            float standardHeight = e.getHeight();
+            if (standardWidth - deviation <= width && width <= standardWidth + deviation && standardHeight - deviation <= height && height <= standardHeight + deviation){
                 return e;
                 return e;
             }
             }
         }
         }

+ 1 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/FileStoreUtil.java

@@ -146,7 +146,7 @@ public class FileStoreUtil {
      * @return 存好的文件
      * @return 存好的文件
      * @throws IOException 异常
      * @throws IOException 异常
      */
      */
-    private File saveLocal(InputStream inputStream, String dirPath) throws IOException {
+    public File saveLocal(InputStream inputStream, String dirPath) throws IOException {
         File desFile = new File(dirPath);
         File desFile = new File(dirPath);
         if (!desFile.exists()) {
         if (!desFile.exists()) {
             desFile.getParentFile().mkdirs(); //目标文件目录不存在的话需要创建目录
             desFile.getParentFile().mkdirs(); //目标文件目录不存在的话需要创建目录

+ 32 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/FileUtil.java

@@ -3,6 +3,7 @@ package com.qmth.teachcloud.common.util;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import org.apache.tomcat.util.http.fileupload.IOUtils;
 import org.apache.tomcat.util.http.fileupload.IOUtils;
+import org.springframework.web.multipart.MultipartFile;
 
 
 import javax.crypto.Cipher;
 import javax.crypto.Cipher;
 import javax.crypto.CipherOutputStream;
 import javax.crypto.CipherOutputStream;
@@ -505,4 +506,35 @@ public class FileUtil {
         }
         }
         return data;
         return data;
     }
     }
+
+    public static File multipartFileToFile(MultipartFile file) throws Exception {
+
+        File toFile = null;
+        if (file.equals("") || file.getSize() <= 0) {
+            file = null;
+        } else {
+            InputStream ins = null;
+            ins = file.getInputStream();
+            toFile = new File(file.getOriginalFilename());
+            inputStreamToFile(ins, toFile);
+            ins.close();
+        }
+        return toFile;
+    }
+
+    //获取流文件
+    private static void inputStreamToFile(InputStream ins, File file) {
+        try {
+            OutputStream os = new FileOutputStream(file);
+            int bytesRead = 0;
+            byte[] buffer = new byte[8192];
+            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
+                os.write(buffer, 0, bytesRead);
+            }
+            os.close();
+            ins.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 }
 }