【丰富版】JAVA读取PDF表格内容

本文介绍了使用Spire.pdf库在Java中提取PDF文本表格数据的过程,包括POM依赖、示例代码和注意事项,如处理换行、错误处理和组件局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spire.pdf + pdf + 表格

背景: 近需要处理一批PDF文本,里面内容都是文本形式的表格数据,需要按指定规则将一些数据提取出来入库。网上看了一些开源的工具,大部分无法处理复杂的表格数据,尤其是涉及到单个表格内部出现换行时,数据抽取基本错乱。后续通过demo发现spire.pdf提供的jar包实现效果较好,虽然有一些BUG,但相较于其他组件,更符合实际项目需求。下面应用概述该组件实现表格抽取的过程及注意事项。

博客内容精选:
1、Servlet请求体重复读&修改新姿势
2、根据请求获取后端接口详情
3、封装Springboot项目的starter-sdk新方式
4、Springboot全局处理完整版
5、itextpdf读取文本时上下行位置错乱
6、JAVA读取PDF表格内容

1、POM依赖引入

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <url>http://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.pdf.free</artifactId>
    <version>5.1.0</version>
</dependency>

注:相较于使用spire做文档转换有3页的限制,表格抽取目前没有明确限制篇数,自身需求也只需处理一两页内容。

2、样例代码

public static String getFormatTableData(String localFile) throws ExtractException {
    PdfDocument pdf = new PdfDocument(localFile);
    StringBuilder builder = new StringBuilder();
    PdfTableExtractor extractor = new PdfTableExtractor(pdf);
    try {
        for (int pageIndex = 0; pageIndex < pdf.getPages().getCount(); pageIndex++) {
            PdfTable[] tableLists = extractor.extractTable(pageIndex);
            if (tableLists != null && tableLists.length > 0) {
                for (PdfTable table : tableLists) {
                    for (int i = 0; i < table.getRowCount(); i++) {
                        for (int j = 0; j < table.getColumnCount(); j++) {
                            String text = table.getText(i, j);
                            if (StringUtils.isNotBlank(text)) {
								//每一行,各字段间用|分开
                                builder.append(text).append("|");
                            }
                        }
                        if (builder.charAt(builder.length() - 1) == '|') {
                            builder.deleteCharAt(builder.length() - 1);
							//使用$作为换行标识
                            builder.append("$");
                        }
                    }
                }
            }
        }
    } catch (Exception e) {
		//可使用图片OCR等方式补救
	} finally {
        pdf.close();
    }
	
	return StringUtils.deleteWhitespace(builder.toString());

说明:
1、数据抽取的基础要求就是各字段内容互不影响,尤其是单元格内换行导致上线行内容错乱
2、抽取字段间需要有明确的起始标记,此处以|分割字段值,以$分割行
3、抽取时另需考虑值为空或非法格式等特殊场景

注意事项:
1、spire.pdf不能读取所有pdf文本中的表格,部分场景直接报错(个人不涉及)
2、spire.pdf依赖包模块化基础较差,单个包就达到50M,远超其他组件包
3、spire.pdf只能识读PDF中的表格数据,表格外内容无法处理(图片OCR一般会兼容)
4、spire.pdf免费版本维护周期较大,已知BUG有行尾有标点符号,则该标点符号会丢失,数据内容就会错乱,有些场景造成的问题很大。

追加:表格外内容无法读取及行尾标点符号丢失问题,解决方法将在其他博客说明

Java中,可以使用一些专门针对PDF处理的库来读取PDF表格数据。其中比较流行的是Apache PDFBox和iText这两个开源库。以下是简要步骤: 1. **添加依赖**: - Apache PDFBox:通过Maven,添加`<dependency>`到pom.xml文件中:`<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>最新本号</version> </dependency>` - iText:同样通过Maven,添加`<dependency>`到pom.xml文件中:`<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>最新本号</version> </dependency>` 2. **解析PDF**: - 使用PDFBox:首先加载PDF文件,然后创建PDF文档分析器(PDFStamper)或PDF文档提取工具(PDFReader)。接着遍历PDF中的表单,识别表格边框、单元格内容等。 ```java PDDocument document = PDDocument.load(new File("path_to_your_pdf")); List<PDPage> pages = document.getPages(); for (PDPage page : pages) { extractTableData(page); } ``` - 使用iText:类似地,需要打开PDF,找到表单区域并解析。 3. **提取数据**: - 对于每个单元格,你可以使用库提供的API获取文本或其他元数据,例如`getText()`方法从PDFBox的`PDCell`或`PDArea`中获取文本。 4. **存储数据**: 将提取的数据转换成你需要的形式(如List、HashMap等),然后用于后续处理或数据库操作。 ```java PDRectangle tableBounds = // 获取表格边界; for (int row = 0; row < tableRows; row++) { for (int col = 0; col < tableColumns; col++) { PDRectangle cellBound = getTableCellBoundaries(tableBounds, row, col); String cellContent = cell.getTextString(); // 或者使用其他方法 processCellData(cellContent); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值