基于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)
}
相关推荐
高级程序源5 分钟前
django大学生创新创业项目管理系统94923-计算机课程设计、毕业设计
javascript·vue.js·spring boot·后端·python·django·课程设计
Sam_Deep_Thinking10 分钟前
new Thread()之后发生了什么?
java·后端·面试·程序员
步行cgn38 分钟前
Spring util 命名空间详解
java·后端·spring
打工仔折腾 AI1 小时前
普通摄像头接入AI识别:绿联NAS部署Frigate监控实战
人工智能·后端·python·性能优化·ai agent 实战
万物智能3 小时前
SARADC模数转换—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
前端·后端
花间相见3 小时前
【后端开发|网络编程】—— 五种实时通信方案全解析:短轮询、长轮询、SSE、MQTT、WebSocket
后端·网络协议
坤岭3 小时前
LLM应用安全护栏实战
后端
程序猿阿越3 小时前
containerd如何创建Pod
后端·kubernetes·源码阅读
名字还没想好☜3 小时前
Python sqlite3 实战:事务提交、参数化防注入、WAL 并发与 row_factory 取字典
后端·python·编程语言