java⽤tabula解析pdf⽂件中的表格
前⾯写了⼀个⽤pdf解析pdf格式的发票,因为发票的样式相当于⼀个表格,之前那篇博客已经说过了,pdfbox没到能定位表格的线坐标的⽅法,所以明细部分的解析不能说是100%的正确,今天⼜到⼀个新的东西,就是tabula,专门解析pdf表格,可以解析各种连分割线都没有的表格,真强,是在pdfbox的基础上再封装的,底层还是pdfbox实现的,github地址
因为了半天能到的博客很少,所以下载了源码看⼀看,⾥⾯有很多test类
我就试了⼀下TestWriters,解出来的和直接⽤pdfbox的PDFTextStripper解析出来是⼀模⼀样的。
在⽹上看到的是⽤CommandLineApp这个类来解析的,研究⼀下这个吧
导⼊依赖
<dependency>
<groupId>technology.tabula</groupId>
<artifactId>tabula</artifactId>
<version>1.0.3</version>
<exclusions>
<exclusion>
<artifactId>slf4j-simple</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
这是所有的
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.1</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.16</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>technology.tabula</groupId>
<artifactId>tabula</artifactId>
<version>1.0.3</version>
<exclusions>
<exclusion>
<artifactId>slf4j-simple</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.6</version>
</dependency>
</dependencies>
开始控制台报了⼀个slf4j的错,是jar冲突导致的,移除tabula依赖⾥的slf4j就好了
@Test
public void test1() {
fastjson怎么用String[] args = new String[]{"-f=JSON","-o=d:/", "-p=all", "D:\\work\\file\\temp\\111.pdf"};
CommandLineApp.main(args);
}
这样⼦解析出来的直接就是按照从上到下从左到右单元格划分的,⽽且带着单元格的坐标,这不就是我之前苦苦要的吗开⼼!
可以⽤之前的⽅法读取表格外⾯的那些字段,⽤tabula来读表格⾥⾯的字段,完美!
在readme⽂件中介绍了参数都是什么意思,虽然我也没怎么看懂
-f=JSON 就是输出json格式,默认是csv的
-o=d:/ 就是输出到⽂件,当然我们解析肯定不⽤输出到⽂件,只要获得字符串就可以了,等下参数应该写什么-p=all 就是解析的页数吧,我这个只有这⼀页
最后⼀个参数就是要读取的pdf⽂件路径了
参数的可以加的,之所以是数组,就是因为参数的个数可以随便传
@Test
public void test1() {
String[] args = new String[]{"-f=JSON", "-p=all", "D:\\work\\file\\temp\\111.pdf"};
CommandLineApp.main(args);
}
去掉-o=d:/的话,直接就输出到控制台了,那么怎么接收呢?
st;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.dering.PDFRenderer;
import org.junit.Test;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
public class PdfBoxTest1 {
@Test
public void test1() throws Exception {
String[] args = new String[]{"-f=JSON", "-p=all", "D:\\work\\file\\temp\\111.pdf"};
//        CommandLineApp.main(args);
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse(CommandLineApp.buildOptions(), args);
StringBuilder stringBuilder = new StringBuilder();
new CommandLineApp(stringBuilder, cmd).extractTables(cmd);
System.out.println("============");
System.out.String());
}
}
完美!哈哈哈,其实那个源码的test⾥就是这么写的
那么接下来就是先去掉坐标为0的元素(不知道为啥,有好多坐标0长宽0的元素),然后按照发票的样⼦,按顺序去取值,然后按照⾏,冒号等等分隔,就可以拿到我们要的内容啦!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。