ocr请求接口

segment2.0
linrf 2 years ago
parent d85aa47da4
commit 9039366bd6

@ -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();
}
}

@ -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 {
/**
* ocrtext
*/
List<String> 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<String, Object> params);
}

@ -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 {
}

@ -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;
}
}

@ -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;
}
}

@ -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<List<Sort>> sort;
private List<Data> 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<List<Sort>> sort) {
this.sort = sort;
}
public List<List<Sort>> getSort() {
return sort;
}
public void setData(List<Data> data) {
this.data = data;
}
public List<Data> getData() {
return data;
}
}

@ -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> datas;
private double time;
private String message;
@ApiModelProperty(value = "响应结果")
private List<OcrVO> datas;
public void setSuccess(boolean success) {
this.success = success;
}
@ApiModelProperty(value = "响应结果")
private Long time;
public boolean getSuccess() {
return success;
}
public void setDatas(List<Datas> datas) {
this.datas = datas;
}
public List<Datas> 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;
}
@ApiModelProperty(value = "响应消息")
private String message;
}

@ -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<SortResult> sort;
}

@ -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;
}
}

@ -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<BoxResult> box;
}

@ -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<String> text = ocrApi.getText("D:\\docus\\cut\\segmentation\\20230822\\c6b03e5767814895a2c155c32f174051\\麻醉.jpg");
}
}

@ -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<String> getText(String path) {
OcrResponse response = ocr(path);
List<Datas> datas = response.getDatas();
List<String> texts = new ArrayList<>();
if (Func.isNotEmpty(datas)) {
datas.forEach(p -> {
List<List<Sort>> 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<String, Object> data = new HashMap<>();
data.put("file", file);
data.put("filetype", "jpg");
return uploadFile(data);
}
@Override
public OcrResponse uploadFile(Map<String, Object> 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();
}
}

@ -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 * * * * ?

@ -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");
}
}

@ -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() {

Loading…
Cancel
Save