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

相关推荐
froginwe111 分钟前
PHP MySQL 插入数据
开发语言
码界奇点3 分钟前
基于Go语言的Web管理面板系统设计与实现
开发语言·后端·golang·毕业设计·web·go语言·源代码管理
WizLC3 分钟前
【后端】关于Elasticsearch的入门,下载安装+使用
java·大数据·后端·elasticsearch·搜索引擎·全文检索
青云交3 分钟前
Java 大视界 -- 438 台物联网设备时序数据难题破解:Java+Redis+HBase+Kafka 实战全解析(查询延迟 18ms)(438)
java·智能制造·redis 缓存·hbase 存储·时序数据处理·kafka 消息队列·ai 异常检测
小此方4 分钟前
Re: ゼロから学ぶ C++ 入門(六)类和对象·第三篇:运算符重载
开发语言·c++·后端
Slow菜鸟5 分钟前
Java基础 | JSON 处理手册
java·开发语言·json
_OP_CHEN5 分钟前
【Python基础】(五)Python 库使用全攻略:从标准库到第三方库,让开发效率翻倍
开发语言·python·pip·项目实战·python标准库·python第三方库
浮尘笔记9 分钟前
Go语言条件变量sync.Cond:线程间的协调者
开发语言·后端·golang
北城以北888810 分钟前
SpringBoot--Spring Boot原生缓存基于Redis的Cacheable注解使用
java·spring boot·redis·缓存·intellij-idea