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

相关推荐
xcl09254 小时前
民宿预约系统开发实战:从需求分析到上线部署全流程解析
java·spring boot
IT_Octopus4 小时前
JSON 日志里的 `{“$ref“:“$.xxx“}`:从 fastjson 兼容包到原生 fastjson2 的迁移实录
开发语言·python·json
geovindu4 小时前
python:HandWriting Recognition using paddlepaddle
开发语言·后端·python·paddlepaddle
步行cgn5 小时前
为何以继承方式引入SpringBoot
java·spring boot·后端
CoderYanger5 小时前
A.每日一题:1140. 石子游戏 II
java·程序人生·算法·leetcode·游戏·职场和发展·深度优先
禾高网络5 小时前
养老系统开发:背景、架构与养老行业展望
java·大数据·人工智能·小程序·架构
wuyk5555 小时前
Python 零基础入门第九章:用户输入与 While 循环
开发语言·python
兮动人5 小时前
Python变量与常量
开发语言·python·机器学习·python变量与常量
CCYe、5 小时前
新模型上线、旧模型下线:企业AI网关如何管住模型版本
java·网络·数据库·人工智能
风筝在晴天搁浅5 小时前
解题代码清爽版
java·开发语言