问题描述
在使用itext的jar包读取pdf表单模板文件的时候,获取到的字段需要按照pdf设置的跳位编号排序(即获取到的字段要按照一定规则进行排序)。但是现有的itext获取到的表单字段默认是无序的,导致根据表单模板字段顺序生成表单的时候就会有问题。
用Adobe Acrobat打开pdf点击准备表单右键显示跳位编号即可显示各个表单字段的跳位编号值。

问题定位
在itext中获取到表单字段的属性是调用reader = new PdfReader(inputStream)获取到pdf文件的封装对象,其中获取到表单字段的方法是reader.getAcroFields()。
在这个方法里面new了一个AcroFields对象

点开看下这个对象的构造函数

看到这里就破案了,itext是把表单字段的对象都放在了HashMap,而HashMap的key值的排序是按照key的HashCode进行排序的。所以这时候需要修改一下源码,将HashMap修改为LinkedHashMap即可。
问题解决
拖动这个类到自己本地包下,包名和源码类的包名要一致,java程序运行的时候会先读取本地包的classpath,然后再读取jar包的类,所以放在本地包下会先加载,这样这个类初始化了就不会加载jar包下的这个类

修改new的map对象为LinkedHashMap即可

至此获取到的pdf表单字段列表就是有序的了。
网友评论