目录
- 背景
- 解决办法
- 确定修改位置
- 得到字节码文件
- 修改字节码文件
- 组合jar包
背景
最近想实现按照分节符拆分doc / docx
文档的功能,然后就找到了这篇文章Java 按节拆分 Word 文档,用的依赖是:
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc.free</artifactId>
<version>5.2.0</version>
</dependency>
但是在使用过程中,出现了以下问题:
很明显的看到报错信息是段落数不能超过500行,否则就会报错,我们从网络上找到了该依赖所属公司的介绍,从下图可以看到报错的原因是加载该文档的时候段落数目超过了500行,然后就报错了
但是我不想被限制,那应该怎么办呢,我尝试了多种方式,发现最终的解决方案是更改jar包中
字节码文件中的数量限制来临时性解决该问题
解决办法
确定修改位置
首先分享给大家的第一个工具是:jd-gui(Java反编译工具).exe
,链接在下面,如下:
链接:https://pan.baidu.com/s/1OMW_m20ylmamucckbh7pMQ?pwd=l5ao
提取码:l5ao
然后我们可以通过该工具将jar包打开,之后我们点击File
,在点击Save All Sources
按钮将源码下载下来,如下:
之后我们在代码中搜索报错中的限制条件,搜索结果如下:
这种位置一共有四处,上面说明了对段落数量和表格数量的限制分别是500和25
现在我们已经确定了需要修改的代码是:
com.spire.doc.collections.DocumentObjectCollection#add
com.spire.doc.collections.DocumentObjectCollection#insert
得到字节码文件
由于jar包类似于zip,所以可以使用压缩工具进行解压缩,比如“360压缩”,解压完成之后,我们找到DocumentObjectCollection.class
字节码文件
修改字节码文件
JavaBite下载信息如下所示:
链接:https://pan.baidu.com/s/162a_Mi-nmIeH42ZkLqFAgw?pwd=a4v9
提取码:a4v9
使用JavaBite工具打开字节码文件,然后找到add()和insert()方法,然后把里面的段落限制500和表格限制25改大一点,我们只说一下add()方法吧,如下:
之后找到数量500
的位置,然后把数据修改成32766
,原因是sipush类似的最大值就是32767
,所以我们该校一位,可能你会有疑问,为什么不在改大一点,原因是在ldc
指令的数据需要放在常量池,这就比较麻烦了;可能也有同学会问到,为什么不删除athrow
指令,原因是删除之后执行方法会报错,错误是本地变量表不一致,原因是我删除athrow
指令的话,那么行数减少,但是本地变量表数量没少,这就造成了数量不一致,所以我们只能通过修改数量的方法来临时解决
然后对于表格最大数量25的限制,我们可以把数量25前面的指令改成sipush
,并且数量写成32767即可
组合jar包
将DocumentObjectCollection.class
字节码文件放回原来的位置,然后选中com
和META-INF
目录,之后打成zip包即可,最终把zip包的后缀名改成jar即可,如下:
之后jar包就可以正常使用了