掘金 后端 ( ) • 2024-04-15 15:53

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

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

官方网站: https://www.textin.com/

名片识别

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

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

使用文档:https://www.textin.com/document/business_card

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

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
}

完整代码如下:

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及图片多种格式的高精度转换,高保真输出,并支持自定义水印等功能,提升文件处理效率。可用于教育文件处理、办公文档处理等场景

完整代码如下:

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)
}