当前位置:首页 > 知识

laravel 引入阿里图文识别

Laravel 引入阿里图文识别

老张上周给我打电话,文识说他们后台要处理一堆用户上传的文识合同扫描件,人工录入编号太慢了。文识我第一反应就是文识阿里云的OCR接口,但真要集成到Laravel项目里,文识坑比想象中多。文识

先说最直接的文识方案:用官方SDK。在composer.json里加上alibabacloud/ocr-api,文识然后跑一遍composer update。文识这一步通常不会出幺蛾子,文识但别高兴太早——阿里云的文识鉴权方式跟Laravel默认的API风格完全不搭。你得在config/services.php里手动配好accessKeyId和accessKeySecret,文识然后自己写个Service类去封装调用逻辑。文识别指望有现成的文识门面能用,我翻遍GitHub都没找到维护得好的文识包。

实际调用的时候,有个细节很容易被忽略:图片不能直接传base64字符串,得先转成二进制流。我一开始按文档写的file_get_contents塞进去,结果返回400。后来才发现阿里云这个接口要求的是image字段必须是URL或者二进制内容,而不是编码后的字符串。调试了半小时,最后用fopen读文件流才解决。

更麻烦的是响应解析。阿里OCR返回的JSON结构嵌套特别深,data下面还有prism_wordsInfo数组,里面每个元素又带word字段。你要是想提取整张图的文字,得写个递归函数去拼接。我建议直接封装成一个OcrService,返回一维数组,每个元素是一行文本。这样业务层调用起来清爽很多。

还有异步问题。同步接口单张图片最多等5秒,但用户上传的扫描件经常是多页PDF。阿里云有个异步识别接口,提交任务后返回taskId,你得自己轮询结果。这个在Laravel里用队列最合适——把任务推送到Redis队列,后台worker去轮询,完成后触发事件通知用户。别用同步调用,否则一个请求挂5秒,用户早跑了。

我踩过的最后一个坑是超时设置。默认Guzzle客户端超时是30秒,但阿里云这个接口偶尔会慢,尤其图片分辨率高的时候。在Service里单独new一个Client,把timeout调到60秒,connect_timeout设成10秒。别怕慢,OCR本来就不是毫秒级的事。

最后给你个建议:把识别结果缓存起来。同一个图片URL,如果用户重复提交,直接查缓存返回,省一次API调用。阿里云这接口按次收费,一次几分钱,但量大了也是成本。用Laravel的Cache门面,key用图片的md5值,简单粗暴。

集成完测试的时候,记得用一张带噪点的图片试试。我拿手机拍的收据测试,识别率大概85%,但打印体合同能到98%。你要是处理手写体,得选专门的模型,默认的通用模型效果一般。

说白了,Laravel引入阿里OCR不难,难的是处理边界情况。多准备几个异常捕获分支,比如图片格式不支持、网络超时、返回结果为空。写个try-catch包住整个调用,抛出自定义异常,然后在前端友好提示。别让用户看到一堆堆栈信息。

分享到: