最近在研究如何快速度处理增值税发票的识别,对百度AI的接口还是感到非常不错的。下面把一些碰到的问题写下来,以方便其它用户。

1、修改EncdDecd.pas 120行处,共三行
2、转到bin\dcc32.exe
3、为保险期间,我先将EncdDecd.pas放在c:\,然后cmd下运行,dcc32.exe c:\EncdDecd.pas会在同目录下生成
EncdDecd.dcu文件,将文件放入lib目录。替换注意备份原文件。
4、按百度原文:“图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持 jpg/jpeg/png/bmp 格式,当image字段存在时url字段失效”
5、先进行Base64转码
function TForm2.BaseImage(fn: string): string;
var
  m1: TMemoryStream;
  m2: TStringStream;
  str: string;
begin
  m1 := TMemoryStream.Create;
  m2 := TStringStream.Create;
  m1.LoadFromFile(fn);
  EncdDecd.EncodeStream(m1, m2);                       // 将m1的内容Base64到m2中
  result:=m2.DataString;                              // 返回值为Base64的Stream
  m1.Free;
  m2.Free;
end;
6、再进行urlencode转码

function TForm2.EncodeURIComponent(const ASrc: string): UTF8String;
const
  HexMap: UTF8String = '0123456789ABCDEF';

function IsSafeChar(ch: Integer): Boolean;
  begin
    if (ch >= 48) and (ch <= 57) then Result := True    // 0-9
    else if (ch >= 65) and (ch <= 90) then Result := True  // A-Z
    else if (ch >= 97) and (ch <= 122) then Result := True  // a-z
    else if (ch = 33) then Result := True // !
    else if (ch >= 39) and (ch <= 42) then Result := True // '()*
    else if (ch >= 45) and (ch <= 46) then Result := True // -.
    else if (ch = 95) then Result := True // _
    else if (ch = 126) then Result := True // ~
    else Result := False;
  end;
var
  I, J: Integer;
  ASrcUTF8: UTF8String;
begin
  Result := '';    {Do not Localize}

ASrcUTF8 := UTF8Encode(ASrc);
  // UTF8Encode call not strictly necessary but
  // prevents implicit conversion warning

I := 1; J := 1;
  SetLength(Result, Length(ASrcUTF8) * 3); // space to %xx encode every byte
  while I <= Length(ASrcUTF8) do
  begin
    if IsSafeChar(Ord(ASrcUTF8[I])) then
    begin
      Result[J] := ASrcUTF8[I];
      Inc(J);
    end
    else if ASrcUTF8[I] = ' ' then
    begin
      Result[J] := '+';
      Inc(J);
    end
    else
    begin
      Result[J] := '%';
      Result[J+1] := HexMap[(Ord(ASrcUTF8[I]) shr 4) + 1];
      Result[J+2] := HexMap[(Ord(ASrcUTF8[I]) and 15) + 1];
      Inc(J,3);
    end;
    Inc(I);
  end;
  SetLength(Result, J-1);
end;

7、接下来通过idhttp把数据post到服务器,因为要支持http所以要加一个IdSSLIOHandlerSocketOpenSSL控件
   这个控件需要二个dll文件支持,ssleay32.dll和libeay32.dll。他们有32位版本和64位版本区别。注意下载好,放在程序目录中。
function TForm2.post_jpg(filename:string): string;
var
  token,url,temp,tmp1:string;
  m1,m2: TStringStream;
  jRet: ISuperObject;
begin
  token:= '*******申请的toeken*******';
  //通用文字识别地址
  //url:= 'https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token='+token;
  //增值税发票识别地址
  url:= 'https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice?access_token='+token;
  idhttp1.Request.ContentType := 'multipart/form-data' ;
  IdHTTP1.Request.UserAgent:='Mozilla/3.0';
  try
        m1 := TStringStream.Create;
        m2 := TStringStream.Create('', TEncoding.UTF8);
        m1.WriteString('image='+EncodeURIComponent(BaseImage(filename)));
        IdHTTP1.Post(url,m1,m2);
        if length(m2.DataString)>100 then
          begin
            jRet:=TSuperObject.Create(stObject);
            jRet := SO(m2.DataString);
            tmp1:=jret.O['words_result'].AsString;
            result:=tmp1;
          end
          else
           result:='error';
  finally
    //m1.Free;
  end;
end;

8、调用方法post_jpg(sfile);

9、最后通过CreateOleObject('Excel.Application');导出至excel,注意要添加ComObj单元。

10、使用的单元
    uses IdMultipartFormData,IdGlobal,EncdDecd,superobject,ComObj;

delphi2010转码Base64图片上传百度AI接口识别发票手记相关推荐

  1. php图片上传为base64,php实现base64图片上传方式实例代码

    /** * base64图片上传 * @param $base64_img * @return array */ header("content-type:text/html;charset ...

  2. App图片上传Base64图片上传

    /*** @Method base64图片上传* @author Angus* return array* date 2018-05-04*/ function saveBase64Image($ba ...

  3. Java做图片上传、文件上传、 批量上传、 Base64图片上传 。附上源码

    Java做文件上传.图片上传后台方法 利用Springboot快速搭建项目环境 项目源码已经上传到码云:https://gitee.com/jack_party/upload .喜欢的朋友可以支持一下 ...

  4. php 图片 投稿 源码,php图片上传,审核,显示源码(转载)

    php图片上传,审核,显示源码(转载) 最近想为http://gif.nbqq.net,加一个网友可以自主上传的页面,然后我审核.所以百度了下源码先.下午好好研究下. 首先来看下上传部分的表单代码: ...

  5. php相册实现图片上传源码,php 图片上传源码下载[gif,jpg]

    php 图片上传源码下载[gif,jpg] 无标题文档 $dest_folder   =  "/picture/"; if(!file_exists($dest_folder)){ ...

  6. base64图片上传Java上传

    controller层获取图片数据调用upload方法 String imagesUrl = null;//获取图片信息String imageBaseStr = reqData.getImageBa ...

  7. php 接收 oc 图片上传,php yii2接口中图片上传

    现在在给ios给接口,遇到了一些图片上传的问题,现在可以接收到ios传来的base64编码后的数据.我是否需要解码?解码又需要怎么处理才能把图片上传到服务器,并从服务器获取URL来存入到数据库呢?求大 ...

  8. C# pdf 转图片 and 创建百度AI文字识别应用(识别图片中的文字和数字)

    /// <summary>/// pdf 转图片/// </summary>public static void Turnpicture(){string str = &quo ...

  9. python调用百度AI接口识别营业执照

    上一篇文章介绍了应用python中的pytesseract库和OCR识别软件进行文字识别.本文介绍应用百度AI的文字识别功能对营业执照进行识别,感兴趣的朋友一起来看看效果吧.    一.安装baidu ...

  10. Springboot文件上传 百度ocr文字识别提取

    前言 在学习过程中突然发现我以前用的文件上传真的好傻.以前的博客记录中还沾沾自喜文件上传模板可以套用,不接收新事物,却发现原来Springboot的文件上传如此简单. 首先,文件上传的三种方式,普通文 ...

最新文章

  1. QT pro文件解析
  2. C++ 多线程教程及实现方法
  3. 数据库面试题【十五、优化查询过程中的数据访问】
  4. (数据科学学习手札30)朴素贝叶斯分类器的原理详解Python与R实现
  5. 前端:Vue前端开发规范,值得收藏!
  6. JavaScript-操作DOM对象-更新dom节点
  7. spark基础之spark streaming的checkpoint机制
  8. php将汉字转换为拼音和得到词语首字母(一)
  9. shop--8.商品类别--批量操作--添加(前端)
  10. 【二分图】【最大匹配】【匈牙利算法】bzoj1191 [HNOI2006]超级英雄Hero
  11. 2008下mysql补丁_windows Server 2008 R2安装Mysql 8的打补丁顺序
  12. Ubuntu下Tinyos安装步骤
  13. 测试用例设计方法之选择原则
  14. VBA下载糗事百科图片
  15. 小米编程真题:风口的猪-中国牛市
  16. c_predicted_api调用模型,初始化创建mxnet预测器不成功,句柄始终等于0
  17. 图像缩放、旋转、翻转、平移
  18. js 正则知识汇总(转)
  19. BOSS管账深度融合钉能力,打破业财数据壁垒实现数据互通
  20. 图像处理 - GLCM灰度共生矩阵如何计算

热门文章

  1. wpe修改充值_WPE修改基础第四课:封包分析教程
  2. 学科分类号查询 计算机工程,学科分类与代码分类号查询.doc
  3. 下载哨兵1精轨数据教程
  4. html中实心黑点,Word 实心黑点怎么打?
  5. Access数据库引擎
  6. Java数据库编程技术 第三章习题
  7. 智能生成标题 易语言代码
  8. apollo代码学习1
  9. 幼儿园管理系统源码【免费分享】
  10. 启示录:新加坡纬壹科技城成功建设经验