aspose处理模板,并去掉水印 jdk17

下载jar包
https://releases.aspose.com/words/java/

在这个页面找到所需要的版本

我使用的是21.6

下载jar包

代码中的位置,在和src目录平级创建一个lib包

pom.xml引入

bash 复制代码
<dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.10.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>3.0.1</version>
        </dependency>
        <!-- 注释掉本地 Aspose 依赖,因为可能导致冲突 -->
        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-words</artifactId>
            <version>21.6.0</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/aspose-words-21.6-jdk17.jar</systemPath>
        </dependency>

添加打包插件配置,不然打包的时候不会本地的jar打包进去

去水印工具类

参考这两篇博客,可以精读

去水印原理
https://blog.csdn.net/qq_42785250/article/details/131325432

针对jdk17 反射获取字段
https://blog.csdn.net/wu_weijie/article/details/129251045

注意添加 jvm启动参数

bash 复制代码
--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED
bash 复制代码
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class PdfUtil {

    static {
        try {
            removeWaterMark();
        } catch (Exception e) {
            // 忽略水印移除失败的情况,避免类初始化失败
            System.err.println("Failed to remove watermark: 水印移除失败 " + e.getMessage());
        }
    }

    public static void doc2pdf(String sourceFile, String targetFile) {
        try {
            long old = System.currentTimeMillis();
            FileOutputStream os = new FileOutputStream(targetFile);
            com.aspose.words.Document doc = new com.aspose.words.Document(sourceFile);
            doc.save(os, com.aspose.words.SaveFormat.PDF);
            os.close();
            long now = System.currentTimeMillis();
            System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒");  //转化用时
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 去除水印
     * 使用反射替换变量
     *
     * @return
     */
    private static void removeWaterMark() throws Exception {
        Class<?> aClass = Class.forName("com.aspose.words.zzXyu");
        Field zzYAC = aClass.getDeclaredField("zzZXG");
        zzYAC.setAccessible(true);

        // 需要添加jvm 参数
        // --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED
        // 从 Java 12 开始,不能直接访问 Field 类的 modifiers 字段
        Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class);
        getDeclaredFields0.setAccessible(true);
        Field[] fields = (Field[]) getDeclaredFields0.invoke(Field.class, false);
        for (Field each : fields) {
            if ("modifiers".equals(each.getName())) {
                each.setAccessible(true);
                each.setInt(zzYAC, zzYAC.getModifiers() & ~Modifier.FINAL);
                break;
            }
        }
        zzYAC.set(null, new byte[]{76, 73, 67, 69, 78, 83, 69, 68});
    }

}

还有几个对应到项目中的工具类

使用

工具类的匹配规则主要看这里

代码:https://github.com/diandianxinghuo/aspose-demo

相关推荐
Zoey的笔记本6 分钟前
「支持ISO27001的GTD协作平台」数据生命周期管理方案与加密通信协议
java·前端·数据库
lpfasd12312 分钟前
Spring Boot 4.0.1 时变更清单
java·spring boot·后端
N***H48618 分钟前
SpringBoot3.3.0集成Knife4j4.5.0实战
java
程序员欣宸1 小时前
LangChain4j实战之十三:函数调用,低级API版本
java·人工智能·ai·langchain4j
charlie1145141911 小时前
从 0 开始的机器学习——NumPy 线性代数部分
开发语言·人工智能·学习·线性代数·算法·机器学习·numpy
Java新手村1 小时前
【订单超时取消怎么设计】
java
catchadmin2 小时前
Laravel12 + Vue3 的免费可商用商业级管理后台 CatchAdmin V5 正式发布
开发语言·php
袁气满满~_~2 小时前
Python数据分析学习
开发语言·笔记·python·学习
阿蒙Amon2 小时前
C#每日面试题-常量和只读变量的区别
java·面试·c#
寻星探路2 小时前
【算法专题】滑动窗口:从“无重复字符”到“字母异位词”的深度剖析
java·开发语言·c++·人工智能·python·算法·ai