无尽光芒

Word转换成Pdf

2021.12.13

最近有个需求是提供word 文档预览和转PDF 的功能,预览计划是先word 转图片做预览,试了几款软件,最终选用Aspose.words 工具,但是试用版会自动加水印,下附去水印教程,仅提供思路参考。

导入 aspose 进行测试

先在官网下载最新版20.12jar 包,选择jdk17 的后缀。在项目中使用maven 导入aspose.wordsPDF 有水印。

        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-words</artifactId>
            <version>20.12</version>
            <classifier>jdk17</classifier>
        </dependency>

测试代码:

        Document doc = new Document(inPath);
        doc.save(outPath, SaveFormat.PDF);

生成好之后的Pdf 文件中带有水印字样。

破解逻辑

设置License的代码找到关键逻辑,在License.class 中发现最终都会调用com.aspose.words.zzZDZ#zzV 这个方法。

进到这个类,把zzV 方法下方的com.aspose.words.zzZDZ#zzZ4ncom.aspose.words.zzZDZ#zzZ4m 通过javassist 反编译把返回值改成1 再重新打包回jar 就可以去水印了。

Javassis 反编译修改

引入jar

<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.27.0-GA</version>
</dependency>

破解代码

    @Test
    public void crackAsposeWords() throws Exception {
       // 原始jar包所在位置
        ClassPool.getDefault().insertClassPath("C:\\Users\\coder\\Downloads\\aspose-words-20.12-jdk17.jar");
        CtClass zzZJJClass = ClassPool.getDefault().getCtClass("com.aspose.words.zzZDZ");
        CtMethod zzZ4u = zzZJJClass.getDeclaredMethod("zzZ4n");
        CtMethod zzZ4t = zzZJJClass.getDeclaredMethod("zzZ4m");
        zzZ4u.setBody("{return 1;}");
        zzZ4t.setBody("{return 1;}");
        zzZJJClass.writeFile("C:\\Users\\coder\\Desktop\\");
    }

运行后会生成一个com 的文件夹,里面就包含了修改过的字节码。

解压原始的aspose-words-20.12-jdk17.jar ,把上述生成的的com文件夹覆盖到解压后的目录中,再把META-INF文件夹里的.RSA.SF文件删除即可

最后把破解后的字节码文件重新打包为jar ,取名为aspose-words-20.12-jdk17.jar

进到解压后的文件夹根目录执行下述命令

jar cvfm aspose-words-20.12-jdk17.jar META-INF/MANIFEST.MF com/

把生成的破解包覆盖本地maven 仓库中的jar 包。

生成出来的PDF 没有水印字样。

word 2 pdf 代码

代码下载

GitHub

破解后的jar包

下载下来之后,直接覆盖到maven 仓库中

Jar包下载