前言
在我们日常开发中经常会有将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>
问题:我们会发现使用POM文件引入依赖的方式无法下载jar包,我们可以通过在官网下载jar放到本地maven仓库的方式解决。
1.1 下载jar包
1.2 放入本地Maven仓库
重新加载下maven即可。
如果你有私有的maven仓库
那就更好办了,直接将jar包
上传到私有maven仓库
即可。
二、示例代码
2.1 WordToPdfUtil
工具类:
java">word">import com.aspose.words.Document;
word">import com.aspose.words.SaveFormat;
word">import lombok.extern.slf4j.Slf4j;
word">import java.io.FileOutputStream;
word">import java.io.InputStream;
@Slf4j
word">public word">class WordsToPDFUtil {
/**
* 输出到指定的目录
* @param is
* @param toPath
* @param fileName
*/
word">public word">static word">void wordToPdf(InputStream is, String toPath,String fileName){
Document doc = word">null;
//去水印
removeWaterMark();
word">try {
String resultPath = toPath + fileName + ".pdf";
FileOutputStream os = word">new FileOutputStream(resultPath);
doc = word">new Document(is);
doc.save(os, SaveFormat.PDF);
} word">catch (Exception e) {
e.printStackTrace();
}
}
/**
* 返回byte数组
* @param is
*/
word">public word">static word">byte[] wordToPdf(InputStream is){
Document doc = word">null;
//去水印
removeWaterMark();
word">try {
// 创建一个字节数组输出流
ByteArrayOutputStream outputStream = word">new ByteArrayOutputStream();
doc = word">new Document(is);
doc.save(outputStream, SaveFormat.PDF);
word">return outputStream.toByteArray();
} word">catch (Exception e) {
e.printStackTrace();
}
word">return word">null;
}
/**
* 去除水印
* 使用反射替换变量
* @return
*/
word">private word">void removeWaterMark() word">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(word">null,word">new word">byte[]{76, 73, 67, 69, 78, 83, 69, 70});
}
}
注意:我们目前使用的Aspose.Words
的版本是21.6
,最新的版本是23.5
,
上面去除水印的代码仅支持到21.6
。上述代码仅供参考学习。