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

相关推荐
小羊没烦恼!2 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里2 天前
java中的继承和多态的区别
java
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕2 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码2 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖3 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时3 天前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
vipxieliang3 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++