基于TexIn API实现文字识别

在本文中,我将讲述如何使用Go语言调用TextIn API实现名片识别和文档转换。

TextIn是合合信息旗下智能文字识别产品,专注智能文字识别16年,为扫描全能王、名片全能王提供OCR能力,是集智能文字识别技术、产品、服务于一身的OCR服务产品,识别精确度很高。

官方网站: www.textin.com/

名片识别

使用名片识别技术,实现可对客户名片关键信息的结构化识别和录入,可应用于金融机构征信评估场景,满足征信评估环节录入客户基本信息、联系方式及职业信息等内容的需求,有效提升信息录入效率,降低用户输入成本,控制业务风险。

我们将使用HTTP网络请求,直接调用TextIN的API,具体的参数和响应在在线文档中。

使用文档:www.textin.com/document/bu...

我们定义如下响应结构体:

go 复制代码
type CardRecognizeResp struct {
    Result struct {
        Type               string     `json:"type"`
        ImageAngle         int        `json:"image_angle"`
        RotatedImageWidth  int        `json:"rotated_image_width"`
        RotatedImageHeight int        `json:"rotated_image_height"`
        ItemList           []CardItem `json:"item_list"`
    }
    Code    int
    Message string
}

完整代码如下:

go 复制代码
func cardRecognize(ctx context.Context, appId, secretCode string, buffer *bytes.Buffer) (string, error) {
    url := CARD_RECOGNITION_URL // API URL
    
    // 使用POST请求
    req, err := http.NewRequest("POST", url, buffer)
    if err != nil {
        return "", err
    }
    req.Header.Set("x-ti-app-id", appId)
    req.Header.Set("x-ti-secret-code", secretCode)
​
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        return "", err
    }
    defer func() {
        _ = resp.Body.Close()
    }()
​
    responseData, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return "", err
    }
​
    var cardResp CardRecognizeResp
    err = sonic.Unmarshal(responseData, &cardResp)
    if err != nil {
        return "", err
    }
​
    resMap := make(map[string]string)
    for _, item := range cardResp.Result.ItemList {
        if len(item.Value) == 0 || item.Key == "crop_image" {
            continue
        }
        resMap[item.Key] = item.Value
    }
​
    result, err := sonic.Marshal(resMap)
    if err != nil {
        return "", err
    }
​
    return string(result), nil
}

文档转换

这里演示PDF和WORD的互相转换

TextIN提供PDF/Word/Excel/PPT及图片多种格式的高精度转换,高保真输出,并支持自定义水印等功能,提升文件处理效率。可用于教育文件处理、办公文档处理等场景

完整代码如下:

go 复制代码
func convertWordToPDF(appId, secretCode string, buffer *bytes.Buffer) ([]byte, error) {
    url := WORD2PDF_URL
​
    req, err := http.NewRequest("POST", url, buffer)
    if err != nil {
        return nil, fmt.Errorf("failed to create request: %v", err)
    }
​
    req.Header.Set("x-ti-app-id", appId)
    req.Header.Set("x-ti-secret-code", secretCode)
​
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        return nil, fmt.Errorf("failed to send request: %v", err)
    }
    defer func(Body io.ReadCloser) {
        _ = Body.Close()
    }(resp.Body)
​
    responseData, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return nil, fmt.Errorf("failed to read response: %v", err)
    }
​
    var textInResp ConvertResp
    err = sonic.Unmarshal(responseData, &textInResp)
    if err != nil {
        return nil, err
    }
    return utils.Base64Decode(textInResp.Result)
}
​
func convertPDFToWord(appId, secretCode string, buffer *bytes.Buffer) ([]byte, error) {
    url := PDF2WORD_URL
​
    req, err := http.NewRequest("POST", url, buffer)
    if err != nil {
        return nil, fmt.Errorf("failed to create request: %v", err)
    }
​
    req.Header.Set("x-ti-app-id", appId)
    req.Header.Set("x-ti-secret-code", secretCode)
​
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        return nil, fmt.Errorf("failed to send request: %v", err)
    }
    defer func(Body io.ReadCloser) {
        _ = Body.Close()
    }(resp.Body)
​
    responseData, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return nil, fmt.Errorf("failed to read response: %v", err)
    }
​
    var textInResp ConvertResp
    err = sonic.Unmarshal(responseData, &textInResp)
    if err != nil {
        return nil, err
    }
    return utils.Base64Decode(textInResp.Result)
}
相关推荐
Z.风止2 分钟前
Go-learning(1)
开发语言·笔记·后端·golang
光电大美美-见合八方中国芯5 分钟前
【SOA仿真6】多层膜仿真计算
后端·restful
小马爱打代码12 分钟前
Spring Boot:Sentinel 企业级熔断、降级与限流实战
spring boot·后端·sentinel
野犬寒鸦24 分钟前
从零起步学习并发编程 || 第二章:多线程与死锁在项目中的应用示例
java·开发语言·数据库·后端·学习
没有bug.的程序员29 分钟前
Spring Cloud Sentinel:熔断降级规则配置与分布式流量防线实战终极指南
java·分布式·后端·spring cloud·sentinel·熔断规则·分布式流量防线
JP-Destiny30 分钟前
后端-RabbitMQ
后端·消息队列·rabbitmq·java-rabbitmq
李慕婉学姐32 分钟前
【开题答辩过程】以《基于SpringBoot Vue的校园后勤管理系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
vue.js·spring boot·后端
咖啡啡不加糖38 分钟前
Arthas 使用指南:Java 应用诊断利器
java·spring boot·后端
努力也学不会java38 分钟前
【Spring Cloud】优雅实现远程调用-OpenFeign
java·人工智能·后端·spring·spring cloud
J_liaty38 分钟前
SpringBoot整合Canal实现数据库实时同步
数据库·spring boot·后端·canal