基于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)
}
相关推荐
吴佳浩 Alben40 分钟前
Python入门指南(四)
开发语言·后端·python
倚栏听风雨1 小时前
lombook java: 找不到符号
后端
码财小子2 小时前
记一次服务器大并发下高延迟问题的定位
后端
我是小妖怪,潇洒又自在2 小时前
springcloud alibaba(九)Nacos Config服务配置
后端·spring·spring cloud
Victor3562 小时前
Netty(26)如何实现基于Netty的RPC框架?
后端
Victor3562 小时前
Netty(25)Netty的序列化和反序列化机制是什么?
后端
qq_12498707533 小时前
重庆三峡学院图书资料管理系统设计与实现(源码+论文+部署+安装)
java·spring boot·后端·mysql·spring·毕业设计
桦说编程3 小时前
并发编程高级技巧:运行时检测死锁,告别死锁焦虑
java·后端·性能优化
无限大64 小时前
为什么"软件测试"很重要?——从 Bug 到高质量软件的保障
后端