【java】使用Aspose.Words将word转PDF并且去水印
From: https://blog.csdn.net/qq_42785250/article/details/131325432
本文介绍了如何在Java项目中使用Aspose.Words库将Word文档转换为PDF,重点讨论了如何处理Aspose.Words的试用版水印问题,通过反射机制去除水印。文章提供了一个WordToPdfUtil工具类的示例代码,包括转换方法和去除水印的详细步骤。
摘要由CSDN通过智能技术生成
😜作 者:是江迪呀
✒️本文关键词:Java、工具类、转换、word转pdf、Aspose.Words、后端
☀️每日 一言:只要思想不滑坡,办法总比困难多。
前言
在我们日常开发中经常会有将word文档转为PDF的场景,有很多种方法我最倾向的的是使用Aspose.Words,原因是转出的PDF内容不会缺失很好用。但是Aspose.Words如果使用的话需要付费,不然转出的PDF会带有水印,但是可以通过代码去除,仅供研究学习。下面让我一起来研究学习下吧。
一、引入依赖
Aspose.Words官网地址
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<version>21.6</version>
<classifier>jdk16</classifier>
</dependency>
1
2
3
4
5
6
问题:我们会发现使用POM文件引入依赖的方式无法下载jar包,我们可以通过在官网下载jar放到本地maven仓库的方式解决。
1.1 下载jar包
1.2 放入本地Maven仓库
重新加载下maven即可。
如果你有私有的maven仓库那就更好办了,直接将jar包上传到私有maven仓库即可。
二、示例代码
2.1 WordToPdfUtil工具类:
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import lombok.extern.slf4j.Slf4j;
import java.io.FileOutputStream;
import java.io.InputStream;
@Slf4j
public class WordsToPDFUtil {
/**
* 输出到指定的目录
* @param is
* @param toPath
* @param fileName
*/
public static void wordToPdf(InputStream is, String toPath,String fileName){
Document doc = null;
//去水印
removeWaterMark();
try {
String resultPath = toPath + fileName + ".pdf";
FileOutputStream os = new FileOutputStream(resultPath);
doc = new Document(is);
doc.save(os, SaveFormat.PDF);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 返回byte数组
* @param is
*/
public static byte[] wordToPdf(InputStream is){
Document doc = null;
//去水印
removeWaterMark();
try {
// 创建一个字节数组输出流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
doc = new Document(is);
doc.save(outputStream, SaveFormat.PDF);
return outputStream.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 去除水印
* 使用反射替换变量
* @return
*/
private void removeWaterMark() throws Exception {
Class<?> aClass = Class.forName("com.aspose.words.zzXyu");
java.lang.reflect.Field zzZXG = aClass.getDeclaredField("zzZXG");
zzZXG.setAccessible(true);
java.lang.reflect.Field modifiersField = zzZXG.getClass().getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(zzZXG, zzZXG.getModifiers() & ~Modifier.FINAL);
zzZXG.set(null,new byte[]{76, 73, 67, 69, 78, 83, 69, 70});
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
转换前:
转换后:
去水印后:
2.2 去水印思路
当我们有购买了许可证时,我们需要使用 License()方法认证许可证,只需要找到认证代码然后使用Java的反射机制将认证代码替换成认证通过即可。
(1)找到许可证验证
License license = new License();
license.setLicense("");
license.setLicense(new FileInputStream(""));
1
2
3
我们通过Debug可以发现认证使用到了两个静态参数:
package com.aspose.words;
final class zzXyu {
//认证
public static final byte[] zzZXG = new byte[]{69, 86, 65, 76, 85, 65, 84, 73, 79, 78};
//认证通过
public static final byte[] zz1Y = new byte[]{76, 73, 67, 69, 78, 83, 69, 68};
}
1
2
3
4
5
6
7
8
9
(2)通过Java反射拿到zzXyu类的Class对象
Class<?> aClass = Class.forName("com.aspose.words.zzXyu");
1
(3)通过反射获取了名为 “zzZXG” 的字段对应的 Field 对象。=
java.lang.reflect.Field zzZXG = aClass.getDeclaredField("zzZXG");
1
(4)设置了字段zzZXG可访问,因为它是私有的
zzZXG.setAccessible(true);
1
(5)获取了zzZXG字段的类型对象(字段的修饰符)
java.lang.reflect.Field modifiersField = zzZXG.getClass().getDeclaredField("modifiers");
1
(5)设置修饰符可以被修改
modifiersField.setAccessible(true);
1
(6)去除zzZXG前面的final修饰符,便于后续修改
modifiersField.setInt(zzZXG, zzZXG.getModifiers() & ~Modifier.FINAL);
1
(7)设置zzZXG的值为校验通过
zzZXG.set(null,new byte[]{76, 73, 67, 69, 78, 83, 69, 68});
1
三、总结
我们上述代码仅供参考学习!
注意:我们目前使用的Aspose.Words的版本是21.6,最新的版本是23.5,上面去除水印的代码仅支持到21.6。
————————————————
上面去水印的方法还没去实践过,先保存以备将来用,去水印是个好东西啊!