From 9039366bd65fb217e83fcf8d6d5740e9b4b86dc8 Mon Sep 17 00:00:00 2001 From: linrf Date: Tue, 22 Aug 2023 15:48:04 +0800 Subject: [PATCH] =?UTF-8?q?ocr=E8=AF=B7=E6=B1=82=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/config/SpringCloudConfig.java | 12 +++ .../java/com/docus/server/api/ocr/OcrApi.java | 27 ++++--- .../com/docus/server/vo/ocr/BoxResult.java | 15 ---- .../java/com/docus/server/vo/ocr/Boxes.java | 51 ++++++++++++ .../java/com/docus/server/vo/ocr/Data.java | 33 ++++++++ .../java/com/docus/server/vo/ocr/Datas.java | 80 +++++++++++++++++++ .../com/docus/server/vo/ocr/OcrResponse.java | 61 +++++++++----- .../java/com/docus/server/vo/ocr/OcrVO.java | 39 --------- .../java/com/docus/server/vo/ocr/Sort.java | 51 ++++++++++++ .../com/docus/server/vo/ocr/SortResult.java | 21 ----- .../server/controller/OcrController.java | 34 ++++++++ .../server/service/impl/OcrServiceImpl.java | 79 ++++++++++++++++++ .../src/main/resources/bootstrap.yml | 2 +- .../docus/server/ImageProcessingExample.java | 37 +++++++-- .../server/TsmsAuthApiApplicationTests.java | 8 ++ 15 files changed, 435 insertions(+), 115 deletions(-) delete mode 100644 docus-client-interface/src/main/java/com/docus/server/vo/ocr/BoxResult.java create mode 100644 docus-client-interface/src/main/java/com/docus/server/vo/ocr/Boxes.java create mode 100644 docus-client-interface/src/main/java/com/docus/server/vo/ocr/Data.java create mode 100644 docus-client-interface/src/main/java/com/docus/server/vo/ocr/Datas.java delete mode 100644 docus-client-interface/src/main/java/com/docus/server/vo/ocr/OcrVO.java create mode 100644 docus-client-interface/src/main/java/com/docus/server/vo/ocr/Sort.java delete mode 100644 docus-client-interface/src/main/java/com/docus/server/vo/ocr/SortResult.java create mode 100644 docus-segmentation/src/main/java/com/docus/server/controller/OcrController.java create mode 100644 docus-segmentation/src/main/java/com/docus/server/service/impl/OcrServiceImpl.java diff --git a/docus-api-common/src/main/java/com/docus/server/common/config/SpringCloudConfig.java b/docus-api-common/src/main/java/com/docus/server/common/config/SpringCloudConfig.java index 6b97dbe..b2a7886 100644 --- a/docus-api-common/src/main/java/com/docus/server/common/config/SpringCloudConfig.java +++ b/docus-api-common/src/main/java/com/docus/server/common/config/SpringCloudConfig.java @@ -1,6 +1,8 @@ package com.docus.server.common.config; import feign.codec.Decoder; +import feign.codec.Encoder; +import feign.form.spring.SpringFormEncoder; import feign.optionals.OptionalDecoder; import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -9,6 +11,8 @@ import org.springframework.boot.autoconfigure.http.HttpMessageConverters; import org.springframework.cloud.openfeign.support.SpringDecoder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Scope; @Configuration public class SpringCloudConfig { @@ -23,4 +27,12 @@ public class SpringCloudConfig { return new OptionalDecoder( new FeignResponseDecoder(new SpringDecoder(this.messageConverters))); } + + @ConditionalOnMissingBean(value = Decoder.class) + @Bean + @Primary + @Scope("prototype") + public Encoder multipartFormEncoder() { + return new SpringFormEncoder(); + } } diff --git a/docus-client-interface/src/main/java/com/docus/server/api/ocr/OcrApi.java b/docus-client-interface/src/main/java/com/docus/server/api/ocr/OcrApi.java index 04be6c1..f0d0279 100644 --- a/docus-client-interface/src/main/java/com/docus/server/api/ocr/OcrApi.java +++ b/docus-client-interface/src/main/java/com/docus/server/api/ocr/OcrApi.java @@ -2,14 +2,10 @@ package com.docus.server.api.ocr; import com.docus.server.vo.ocr.OcrResponse; import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.multipart.MultipartFile; + +import java.util.List; +import java.util.Map; /** @@ -19,17 +15,22 @@ import org.springframework.web.multipart.MultipartFile; * @since 2023-07-15 */ @Api(value = "OCR接口", tags = "OCR接口") -@FeignClient(url = "${ocr.api-url:http://192.168.16.85:9999}", name = "docus-segmentation.OcrApi") public interface OcrApi { + /** + * 获取ocr识别回来的text + */ + List getText(String path); + + /** + * 封装ocr 请求 + */ + OcrResponse ocr(String path); + /** * ocr文件上传识别 */ @ApiOperation("ocr文件上传识别") - @PostMapping("/uploadfile") - @ApiImplicitParams({ - @ApiImplicitParam(name = "file", value = "文件", required = true, dataTypeClass = MultipartFile.class) - }) - OcrResponse uploadFile(@RequestParam(value = "filetype") String fileType, @RequestPart("file") MultipartFile[] multipartFiles); + OcrResponse uploadFile(Map params); } diff --git a/docus-client-interface/src/main/java/com/docus/server/vo/ocr/BoxResult.java b/docus-client-interface/src/main/java/com/docus/server/vo/ocr/BoxResult.java deleted file mode 100644 index fd72f0e..0000000 --- a/docus-client-interface/src/main/java/com/docus/server/vo/ocr/BoxResult.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.docus.server.vo.ocr; - -import io.swagger.annotations.ApiModel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Data -@ApiModel(value = "BoxResult", description = "BoxResult") -public class BoxResult { -} diff --git a/docus-client-interface/src/main/java/com/docus/server/vo/ocr/Boxes.java b/docus-client-interface/src/main/java/com/docus/server/vo/ocr/Boxes.java new file mode 100644 index 0000000..64f7380 --- /dev/null +++ b/docus-client-interface/src/main/java/com/docus/server/vo/ocr/Boxes.java @@ -0,0 +1,51 @@ +/** + * Copyright 2023 json.cn + */ +package com.docus.server.vo.ocr; + +/** + * Auto-generated: 2023-08-22 11:21:12 + * + * @author json.cn (i@json.cn) + * @website http://www.json.cn/java2pojo/ + */ +public class Boxes { + + private int left; + private int right; + private int top; + private int bottom; + + public void setLeft(int left) { + this.left = left; + } + + public int getLeft() { + return left; + } + + public void setRight(int right) { + this.right = right; + } + + public int getRight() { + return right; + } + + public void setTop(int top) { + this.top = top; + } + + public int getTop() { + return top; + } + + public void setBottom(int bottom) { + this.bottom = bottom; + } + + public int getBottom() { + return bottom; + } + +} \ No newline at end of file diff --git a/docus-client-interface/src/main/java/com/docus/server/vo/ocr/Data.java b/docus-client-interface/src/main/java/com/docus/server/vo/ocr/Data.java new file mode 100644 index 0000000..ae12775 --- /dev/null +++ b/docus-client-interface/src/main/java/com/docus/server/vo/ocr/Data.java @@ -0,0 +1,33 @@ +/** + * Copyright 2023 json.cn + */ +package com.docus.server.vo.ocr; + +/** + * Auto-generated: 2023-08-22 11:21:12 + * + * @author json.cn (i@json.cn) + * @website http://www.json.cn/java2pojo/ + */ +public class Data { + + private Boxes boxes; + private String text; + + public void setBoxes(Boxes boxes) { + this.boxes = boxes; + } + + public Boxes getBoxes() { + return boxes; + } + + public void setText(String text) { + this.text = text; + } + + public String getText() { + return text; + } + +} \ No newline at end of file diff --git a/docus-client-interface/src/main/java/com/docus/server/vo/ocr/Datas.java b/docus-client-interface/src/main/java/com/docus/server/vo/ocr/Datas.java new file mode 100644 index 0000000..49af1c6 --- /dev/null +++ b/docus-client-interface/src/main/java/com/docus/server/vo/ocr/Datas.java @@ -0,0 +1,80 @@ +/** + * Copyright 2023 json.cn + */ +package com.docus.server.vo.ocr; + +import java.util.List; + +/** + * Auto-generated: 2023-08-22 11:21:12 + * + * @author json.cn (i@json.cn) + * @website http://www.json.cn/java2pojo/ + */ +public class Datas { + + private int index; + private String file_type; + private String angle; + private boolean decline; + private boolean hand_shadow; + private List> sort; + private List data; + + public void setIndex(int index) { + this.index = index; + } + + public int getIndex() { + return index; + } + + public void setFile_type(String file_type) { + this.file_type = file_type; + } + + public String getFile_type() { + return file_type; + } + + public void setAngle(String angle) { + this.angle = angle; + } + + public String getAngle() { + return angle; + } + + public void setDecline(boolean decline) { + this.decline = decline; + } + + public boolean getDecline() { + return decline; + } + + public void setHand_shadow(boolean hand_shadow) { + this.hand_shadow = hand_shadow; + } + + public boolean getHand_shadow() { + return hand_shadow; + } + + public void setSort(List> sort) { + this.sort = sort; + } + + public List> getSort() { + return sort; + } + + public void setData(List data) { + this.data = data; + } + + public List getData() { + return data; + } + +} \ No newline at end of file diff --git a/docus-client-interface/src/main/java/com/docus/server/vo/ocr/OcrResponse.java b/docus-client-interface/src/main/java/com/docus/server/vo/ocr/OcrResponse.java index 10bd6da..7e231ce 100644 --- a/docus-client-interface/src/main/java/com/docus/server/vo/ocr/OcrResponse.java +++ b/docus-client-interface/src/main/java/com/docus/server/vo/ocr/OcrResponse.java @@ -1,30 +1,51 @@ -package com.docus.server.vo.ocr; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +package com.docus.server.vo.ocr; import java.util.List; -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Data -@ApiModel(value = "OcrResponse", description = "OcrResponse") +/** + * Auto-generated: 2023-08-22 11:21:12 + * + * @author json.cn (i@json.cn) + * @website http://www.json.cn/java2pojo/ + */ public class OcrResponse { - @ApiModelProperty(value = "是否成功") private boolean success; + private List datas; + private double time; + private String message; - @ApiModelProperty(value = "响应结果") - private List datas; + public void setSuccess(boolean success) { + this.success = success; + } - @ApiModelProperty(value = "响应结果") - private Long time; + public boolean getSuccess() { + return success; + } - @ApiModelProperty(value = "响应消息") - private String message; -} + public void setDatas(List datas) { + this.datas = datas; + } + + public List getDatas() { + return datas; + } + + public void setTime(double time) { + this.time = time; + } + + public double getTime() { + return time; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + +} \ No newline at end of file diff --git a/docus-client-interface/src/main/java/com/docus/server/vo/ocr/OcrVO.java b/docus-client-interface/src/main/java/com/docus/server/vo/ocr/OcrVO.java deleted file mode 100644 index 811ba4a..0000000 --- a/docus-client-interface/src/main/java/com/docus/server/vo/ocr/OcrVO.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.docus.server.vo.ocr; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Data -@ApiModel(value = "OcrVO", description = "OcrVO") -public class OcrVO { - - @ApiModelProperty(value = "索引") - private Long index; - - @ApiModelProperty(value = "文件类型") - @JsonProperty(value = "file_type") - private String fileType; - - @ApiModelProperty(value = "旋转角度") - private String angle; - - @ApiModelProperty(value = "下降") - private boolean decline; - - @ApiModelProperty(value = "手动阴影") - @JsonProperty(value = "hand_shadow") - private boolean handShadow; - - @ApiModelProperty(value = "排序") - private List sort; -} diff --git a/docus-client-interface/src/main/java/com/docus/server/vo/ocr/Sort.java b/docus-client-interface/src/main/java/com/docus/server/vo/ocr/Sort.java new file mode 100644 index 0000000..fe0ea7a --- /dev/null +++ b/docus-client-interface/src/main/java/com/docus/server/vo/ocr/Sort.java @@ -0,0 +1,51 @@ +/** + * Copyright 2023 json.cn + */ +package com.docus.server.vo.ocr; + +/** + * Auto-generated: 2023-08-22 11:21:12 + * + * @author json.cn (i@json.cn) + * @website http://www.json.cn/java2pojo/ + */ +public class Sort { + + private Boxes boxes; + private String text; + private int x; + private int y; + + public void setBoxes(Boxes boxes) { + this.boxes = boxes; + } + + public Boxes getBoxes() { + return boxes; + } + + public void setText(String text) { + this.text = text; + } + + public String getText() { + return text; + } + + public void setX(int x) { + this.x = x; + } + + public int getX() { + return x; + } + + public void setY(int y) { + this.y = y; + } + + public int getY() { + return y; + } + +} \ No newline at end of file diff --git a/docus-client-interface/src/main/java/com/docus/server/vo/ocr/SortResult.java b/docus-client-interface/src/main/java/com/docus/server/vo/ocr/SortResult.java deleted file mode 100644 index d1b9c0d..0000000 --- a/docus-client-interface/src/main/java/com/docus/server/vo/ocr/SortResult.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.docus.server.vo.ocr; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Data -@ApiModel(value = "SortResult", description = "SortResult") -public class SortResult { - - @ApiModelProperty(value = "排序") - private List box; -} diff --git a/docus-segmentation/src/main/java/com/docus/server/controller/OcrController.java b/docus-segmentation/src/main/java/com/docus/server/controller/OcrController.java new file mode 100644 index 0000000..2f1a13a --- /dev/null +++ b/docus-segmentation/src/main/java/com/docus/server/controller/OcrController.java @@ -0,0 +1,34 @@ +package com.docus.server.controller; + +import com.docus.server.api.ocr.OcrApi; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +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; +import java.util.List; + +/** + * ocr API + * + * @author AutoGenerator + * @since 2023-07-15 + */ +@Api(value = "ocr", tags = "ocr") +@RestController +@RequestMapping("/ocr") +public class OcrController { + @Resource + private OcrApi ocrApi; + + @ApiOperation("ocr") + @GetMapping("/ocr") + public void ocr() throws Exception { + List text = ocrApi.getText("D:\\docus\\cut\\segmentation\\20230822\\c6b03e5767814895a2c155c32f174051\\麻醉.jpg"); + + } + + +} diff --git a/docus-segmentation/src/main/java/com/docus/server/service/impl/OcrServiceImpl.java b/docus-segmentation/src/main/java/com/docus/server/service/impl/OcrServiceImpl.java new file mode 100644 index 0000000..e2b22f6 --- /dev/null +++ b/docus-segmentation/src/main/java/com/docus/server/service/impl/OcrServiceImpl.java @@ -0,0 +1,79 @@ +package com.docus.server.service.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSON; +import com.docus.core.util.Func; +import com.docus.server.api.ocr.OcrApi; +import com.docus.server.vo.ocr.Datas; +import com.docus.server.vo.ocr.OcrResponse; +import com.docus.server.vo.ocr.Sort; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class OcrServiceImpl implements OcrApi { + + @Value("${ocr.api-url:http://192.168.16.85:9999/uploadfile}") + private String ocrHttpUrl; + + @Override + public List getText(String path) { + OcrResponse response = ocr(path); + + List datas = response.getDatas(); + + List texts = new ArrayList<>(); + + if (Func.isNotEmpty(datas)) { + datas.forEach(p -> { + List> sorts = p.getSort(); + + if (Func.isNotEmpty(sorts)) { + sorts.forEach(s -> s.forEach(l -> { + String text = l.getText(); + + texts.add(text); + + })); + } + + }); + + } + + return texts; + } + + @Override + public OcrResponse ocr(String path) { + File file = new File(path); + Map data = new HashMap<>(); + data.put("file", file); + data.put("filetype", "jpg"); + return uploadFile(data); + } + + @Override + public OcrResponse uploadFile(Map params) { + + String body = HttpRequest.post(ocrHttpUrl) + .form(params) + .contentType("multipart/form-data") + .execute() + .body(); + + if (StrUtil.isNotBlank(body)) { + return JSON.parseObject(body, OcrResponse.class); + } + + return new OcrResponse(); + } + +} diff --git a/docus-segmentation/src/main/resources/bootstrap.yml b/docus-segmentation/src/main/resources/bootstrap.yml index 57e42cf..29ebeef 100644 --- a/docus-segmentation/src/main/resources/bootstrap.yml +++ b/docus-segmentation/src/main/resources/bootstrap.yml @@ -55,7 +55,7 @@ file: uploadCutFolder: D://docus/cut/ ocr: - api-url: 192.168.16.85:9999 + api-url: http://192.168.16.85:9999/uploadfile docus: vm-task-cron: 0/30 * * * * ? diff --git a/docus-segmentation/src/test/java/com/docus/server/ImageProcessingExample.java b/docus-segmentation/src/test/java/com/docus/server/ImageProcessingExample.java index ae54829..2f1af57 100644 --- a/docus-segmentation/src/test/java/com/docus/server/ImageProcessingExample.java +++ b/docus-segmentation/src/test/java/com/docus/server/ImageProcessingExample.java @@ -1,10 +1,13 @@ package com.docus.server; -import cn.hutool.core.img.ImgUtil; -import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSON; +import com.docus.server.vo.ocr.OcrResponse; -import javax.imageio.ImageIO; -import java.awt.*; +import java.io.File; +import java.util.HashMap; +import java.util.Map; public class ImageProcessingExample { @@ -16,9 +19,31 @@ public class ImageProcessingExample { // ImgUtil.cut(FileUtil.file("C:\\Users\\dataexa\\Desktop\\麻醉.jpg"), FileUtil.file("C:\\Users\\dataexa\\Desktop\\output1.jpg"), new Rectangle(50, 50, 2400, (3527 / 2) / 2)); // 从input.jpg中裁剪出一个200x200的区域,保存为output.jpg // 5. 图片旋转 - Image image = ImgUtil.rotate(ImageIO.read(FileUtil.file("C:\\Users\\dataexa\\Desktop\\麻醉.jpg")), 90); - ImgUtil.write(image, FileUtil.file("C:\\Users\\dataexa\\Desktop\\output2.jpg")); +// Image image = ImgUtil.rotate(ImageIO.read(FileUtil.file("C:\\Users\\dataexa\\Desktop\\麻醉.jpg")), 90); +// ImgUtil.write(image, FileUtil.file("C:\\Users\\dataexa\\Desktop\\output2.jpg")); + uploadByte("D:\\docus\\cut\\segmentation\\20230822\\c6b03e5767814895a2c155c32f174051\\麻醉.jpg"); } + public static void uploadByte(String path) { + File toFile = new File(path); + Map data = new HashMap(); + data.put("file", toFile); + data.put("filetype", "jpg"); + String body = HttpRequest.post("http://192.168.16.85:9999/uploadfile") + .form(data) + .contentType("multipart/form-data") + .execute() + .body(); + if (StrUtil.isNotBlank(body)) { + OcrResponse jsonRootBean = JSON.parseObject(body, OcrResponse.class); + System.out.println(jsonRootBean); + } + +// Boolean success = (Boolean)result.get("success"); +// BigDecimal time = (BigDecimal)result.get("time"); + + } + + } diff --git a/docus-segmentation/src/test/java/com/docus/server/TsmsAuthApiApplicationTests.java b/docus-segmentation/src/test/java/com/docus/server/TsmsAuthApiApplicationTests.java index 18fefea..9ecbf9c 100644 --- a/docus-segmentation/src/test/java/com/docus/server/TsmsAuthApiApplicationTests.java +++ b/docus-segmentation/src/test/java/com/docus/server/TsmsAuthApiApplicationTests.java @@ -6,6 +6,8 @@ import cn.smallbun.screw.core.engine.EngineFileType; import cn.smallbun.screw.core.engine.EngineTemplateType; import cn.smallbun.screw.core.execute.DocumentationExecute; import cn.smallbun.screw.core.process.ProcessConfig; +import com.docus.server.api.ocr.OcrApi; +import com.docus.server.vo.ocr.OcrResponse; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.Test; @@ -13,14 +15,20 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; +import javax.annotation.Resource; import javax.sql.DataSource; +import java.io.File; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; @SpringBootTest class ScrewTests { @Autowired private ApplicationContext applicationContext; + @Resource + private OcrApi ocrApi; @Test void test() {