头图

技术阿里云实现ocr批量图片和pdf文件表格图片转换excel文档/支持票据图片提取/普通图片文字提取处理

支持pdf/图片/表格等格式文件装换成excel文件或其他格式文件

首先,图片识别过程

 @Test
    void request_002() throws FileNotFoundException {
        //读取文件夹
        String fileSource = "C:\\Users\\Administrator\\Desktop\\work\\20221217\\invoice\\pageFiles";
        String fileName = fileSource + "\\excelFile\\" + "票据_" + DateUtil.format(DateUtil.date(), DatePattern.PURE_DATETIME_PATTERN) + ".xlsx";
        long beginTime = System.currentTimeMillis();
        List<File> files = FileUtil.loopFiles(fileSource);
        List<InvoiceVO> getList = new ArrayList<>();
        for (File file : files) {
            Console.log("开始识别文件 : {}", file.getName());
            //请求参数
            RecognizeInvoiceRequest request = new RecognizeInvoiceRequest();
            RuntimeOptions runtime = new RuntimeOptions();
            request.body = new FileInputStream(file.getPath());
            try {
                RecognizeInvoiceResponse response = client().recognizeInvoiceWithOptions(request, runtime);
                Console.log("文件 :{} 识别成功", file.getName());
                JSONObject jsonObject = JSONObject.parseObject(response.body.data);
                String data = jsonObject.getString("data");
                Console.log("data : => {}", data);
                InvoiceVO invoiceData = JSONUtil.toBean(data, InvoiceVO.class);
                getList.add(invoiceData);
            } catch (TeaException error) {
                Console.log(error.message);
            } catch (Exception _error) {
                TeaException error = new TeaException(_error.getMessage(), _error);
                Console.log(error.message);
            }
        }
        //执行写出
        if (getList.size() > 0) {
            Console.log("开始写出excel文件~");
            toExcel(getList, fileName);
            Console.log("文件 : {}  写出成功! 总耗时 : {} 秒", fileName, (System.currentTimeMillis() - beginTime) / 1000);
        }
    }

接着,写出excel文件

private void toExcel(List<InvoiceVO> getList, String filePathName) {
        //合并单元格 (开始列,结束列)
        TreeMap<Integer, Integer> treeMap = new TreeMap<>();
        int beforeRow = 1;

        //不进行合并的列
        List<Integer> unMergeList = new ArrayList<>();

        //写出的文件列表
        List<InvoiceVO> dataList = new ArrayList<>();
        for (int i = 0; i < getList.size(); i++) {
            InvoiceVO invoiceVO = getList.get(i);
            List<InvoiceDetails> details = invoiceVO.getInvoiceDetails();
            for (InvoiceDetails detail : details) {
                InvoiceVO vo = new InvoiceVO();
                BeanUtil.copyProperties(invoiceVO, vo);
                BeanUtil.copyProperties(detail, vo);
                dataList.add(vo);
            }
            //防止越过合并处理
            int detailSize = details.size();
            int afterRowSize = beforeRow + detailSize;
            treeMap.put(beforeRow, afterRowSize - 1);
            if(detailSize <= 1){
                unMergeList.add(beforeRow);
            }
            beforeRow = afterRowSize;
        }

        //写出文件
        ExcelWriter writer = ExcelUtil.getWriter(filePathName);
        //标题
        addHeader(writer);
        //自动列宽
        writer.autoSizeColumnAll();
        treeMap.forEach((k, v) -> {
            //一行详情就不进行合并
            if(!unMergeList.contains(k)){
                for (int i = 0; i < 22; i++) {
                    //merge : 开始的列号,结束的列号,开始的行号,结束的行号,合并后的数据(自动填充输出数据的列表),是否保留原样式
                    writer.merge(k, v, i, i, "合并数据", false);
                }
            }
        });
        writer.setOnlyAlias(true);
        writer.write(dataList,true);
        writer.close();
    }

最后,效果图

提取效果图

更多具体功能实现微/电:16717696360

业务范围

专注技术开发、自动化办公脚本、数据处理、数据爬取...Wecat:W13611455764

13 声望
1 粉丝
0 条评论
推荐阅读
录音文件/音频实现mp3等文件语音转换文字txt文档提取文字精准高效识别
实现对mp3等录音文件进行语音识别成文字,最终获取文档格式或者其它定义格式文件,也可以进行提取数据处理逻辑,轻松实现大文件的语音文字转换功能,精准高效便捷...

Jame阅读 166

封面图
Java12的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft63阅读 11.9k

Java8的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft32阅读 24.7k评论 1

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go34阅读 2.6k评论 1

封面图
Java11的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft28阅读 15.5k评论 3

Java5的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft13阅读 20.5k

Java9的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft20阅读 14.6k

专注技术开发、自动化办公脚本、数据处理、数据爬取...Wecat:W13611455764

13 声望
1 粉丝
宣传栏