springboot+tabula解析pdf中的表格数据

场景

在日常业务需求中,往往会遇到解析pdf数据获取文本的需求,常见的做法是使用 pdfbox 来做,但是它只适合做一些简单的段落文本解析,无法处理表格这种复杂类型,因为单元格中的文本有换行的情况,无法对应到我们业务具体的属性上面去。而 tabula 在它的基础上做了表格的特殊处理,使用案例如下:

引入依赖

xml 复制代码
<!-- PDF解析,内含pdfbox -->
<dependency>
    <groupId>technology.tabula</groupId>
    <artifactId>tabula</artifactId>
    <version>1.0.5</version>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.53</version>
</dependency>

代码实现

java 复制代码
package net.lab1024.sa.admin.util;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import technology.tabula.*;
import technology.tabula.extractors.SpreadsheetExtractionAlgorithm;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

@Slf4j
public class PdfUtil {

    public static void main(String[] args) {
        JSONArray jsonArray = readPdfTable("C:\\Users\\admin\\Desktop\\xxx.pdf");
        System.out.println(jsonArray);
    }

    /**
     * 解析pdf的表格
     *
     * @param filePath
     * @return
     */
    public static JSONArray readPdfTable(String filePath) {
        // 表头
        // todo 这里自己先定义了,使用时可读取表头的中文作为key或者将中文翻译成英文作为key
        List<String> fieldList = new ArrayList<>();
        fieldList.add("jydh");
        fieldList.add("jysj");
        fieldList.add("jylx");
        fieldList.add("szqt");
        fieldList.add("jyfs");
        fieldList.add("je");
        fieldList.add("jydf");
        fieldList.add("shdh");

        JSONArray jsonArray = new JSONArray();

        // 表格提取算法
        SpreadsheetExtractionAlgorithm algorithm = new SpreadsheetExtractionAlgorithm();

        try (PDDocument document = PDDocument.load(new File(filePath))) {
            ObjectExtractor extractor = new ObjectExtractor(document);
            PageIterator pi = extractor.extract();
            // 遍历页
            while (pi.hasNext()) {
                Page page = pi.next();
                List<Table> tableList = algorithm.extract(page);
                // 遍历表
                for (Table table : tableList) {
                    List<List<RectangularTextContainer>> rowList = table.getRows();
                    // 遍历行
                    for (List<RectangularTextContainer> row : rowList) {
                        JSONObject jsonObject = new JSONObject();
                        // 遍历列
                        for (int i = 0; i < row.size(); i++) {
                            RectangularTextContainer cell = row.get(i);
                            String text = cell.getText().replace("\r", "");
                            jsonObject.put(fieldList.get(i), text);
                        }
                        jsonArray.add(jsonObject);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jsonArray;
    }

}
相关推荐
paopaokaka_luck4 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
SL_staff4 小时前
JVS混合架构实践:能力引擎+动态模型如何支撑企业级可持续交付
spring boot·低代码·全栈
迪飞特科技4 小时前
智慧物业平台实战:Spring Boot 整合小程序实现报修巡检费用全流程
spring boot·后端·小程序
考虑考虑4 小时前
@JsonInclude注解使用
spring boot·后端·spring
凤山老林9 小时前
Spring Boot 集成 Redis Stream 做可靠消息队列:持久化、消费组重组与流式处理实战
spring boot·redis·后端
.Hypocritical.10 小时前
SpringBoot+Vue 前后端分离项目部署到云服务器
服务器·vue.js·spring boot
云和数据.ChenGuang11 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整指南
java·人工智能·spring boot·后端·重构·springai
豆角焖肉12 小时前
SpringBoot 集成腾讯 AI 人脸识别
人工智能·spring boot·后端·人脸识别·腾讯 ai·base64 图片
十年Java程序媛12 小时前
Java String、StringBuilder、StringBuffer 底层原理|字符串拼接性能与线程安全
java·开发语言·spring boot·安全·面试
她的男孩12 小时前
升级 Spring Boot 4 后流程起不来、登录却报缺租户:Forge Admin 补上 applicationTaskExecutor 与旧 Sa-Tok
spring boot·安全·工作流引擎