需要从每日生成的 pdf 文件中解析出内容存入数据库,对于 Java 来说,可选择的二个常用库是 Apache pdfbox或 iText 。 这二个库解析一般的 pdf 文件获取内容方式都很简单。pdf 文件里有表格,要解析表格里的内容并不难,但是困难是无法确定解析出来的内容是归属于那一组数据 。如下图:
这个表格有10列,有若干行数据, 第一行数据里的 Description 列过长显示了三行,后面还有若干行数据,每一行数据的 Description 都有好几行,程序无法判定那几行 Description 属于那一行数据。
尝试换一个思路来解决这个问题,谷歌百度一下是否有工具可以把 pdf 文件转换成 excel 格式或 html 格式,然后再处理对应的 excel 或 html,应该能很好的解决这个问题。在找寻的过程中找到了2个非常好的工具。
-
tabula 这个工具是专门用来处理 pdf 里的表格,下载 windows 版本是一个 exe 或 jar 包,启动后自带一个 web 服务,但是浏览器访问网址后因为 gbk 的问题,打不开。没办法,在 centos 里启动后才可以。工具很强大,自带 web 管理页面,能图形化识别定位 pdf 文件里表格所在的位置,能解析 pdf 里的表格内容并导出各种格式,包括 excel ,可惜的是它把 Description 里三行数据也解析成 excel 里的 三个 cell,还是没办法解决我的问题。
-
pdf2htmlEX 这个工具作用如其名,pdf 转换成的 html 效果很好,生成的 html 就一个文件,而且显示的效果和 pdf 完全一样。看它带的例子,很复杂的 pdf 都能很好的转换。
安装有一些麻烦,在 centos 上按文档总是提示各种错误,后来改成 docker 安装,轻松搞定。参考wiki/Download
下载使用命令 :
docker pull bwits/pdf2htmlex
转换命令:
docker run -ti --rm -v ~/pdf:/pdf bwits/pdf2htmlex pdf2htmlEX --zoom 1.3 test.pdf
回来笔者碰到的问题,右键查看源码,发现一行对应的 Description 都在第一列值的下面,理论上应该可以解决这个问题,但是实际肯定要繁琐很多,每个pdf都要调用 docker 命令去转换一遍,而且解析html也复杂,里面所有的 class 都不一样。
后来发现通过 pdfbox 和 itext 解析的内容分析,结合起来可以解决这个问题,最后每个 pdf 分别用这二个库解析出来的文本,通过算法不是很完美的完成这个工作,这里面还得有一些前提条件,比如第三列到最后一列都必须有值(客户确认过所有pdf这几列都有值)。总之利用提供的8个 pdf 示例,凑出了解决方法,如果碰到新的情况,还得改进算法,或者让客户自己手动去修改。
不管如何,比客户每天手动去打开 pdf 文件再去拷贝里面一项项内容效率会高n倍。
网友评论