1.引入依赖
aspose-words的包需要从官网下载
<dependency> <groupId>fakepath</groupId> <artifactId>aspose-words</artifactId> <version>21.6.0</version> <classifier>jdk17</classifier> </dependency>
2. 这里需要下载21.6.0上传到自己公司的仓库,或者加入到依赖包,没有找到依赖包的可以私信我
3.word转pdf工具类
/**
* @version 1.0
* @date 2022/7/19 18:02
*/
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import javassist.Modifier;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.gz.common.utils.DateUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.Date;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@Slf4j
public class Word2PdfUtil {
public final static String fileUrl = "/home/server/overdue/";
public final static String windowsFile = "C:\\home\\server\\overdue\\";
/**
* 方法说明: 将存在云盘的word文件,更具map 配置的key,value关键字替换word的文件类容
* 将替换好的word文件转换为pdf,存放到本地文件目录
* @param url word 网络文件存放地址
* @param fileName 文件名称
* @param map 需要替换 word 文件的内容
* @return
* @throws Exception
*/
public static String wordToPdf(String url, String fileName, Map<String, String> map) throws Exception {
FileOutputStream os = null;
String osFile = "";
//这里定义文件夹名称,可以按时间定义,自己实现下
String dataStr = "20220722";
try {
String osUrl = "";
String osName = System.getProperties().getProperty("os.name");
if (osName.indexOf("Windows")>=0) {
osUrl = windowsFile.concat(dataStr).concat("/");
}else{
osUrl = fileUrl.concat(dataStr).concat("/");
}
//生成一个空的PDF文件
String prefix = fileName.substring(0,fileName.indexOf("."));
osFile = osUrl.concat(prefix).concat(".pdf");
File file = new File(osFile);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdir();
}
os = new FileOutputStream(file);
//要转换的word文件
String docHome = osUrl.concat(fileName);
try {
FileUtils.copyURLToFile(new URL(url), new File(osUrl, fileName));
}catch (Exception e){
log.error("【下载模板失败】:{}",e);
}
log.info("【docHome】:{}",docHome);
Document doc = new Document(docHome);
for (Map.Entry<String, String> entry: map.entrySet()) {
doc.getRange().replace(entry.getKey(), entry.getValue());
}
doc.save(os, SaveFormat.PDF);
} catch (Exception e) {
log.error("【word转pdf异常】:{}",e);
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
log.error("【word转pdf io异常】:{}",e);
}
}
}
return osFile;
}
}
4.在Linux需要安装字体包 进入C:\Windows\Fonts,该文件夹下就存放相关字体打包成压缩包
/home/server/目录下增加overdue文件夹
给overdue文件夹 chmod 755 权限
需要在 linux系统配置字体包
安装步骤:
1./usr/share/fonts 目录下新增 my_fonts
给my_fonts文件 chmod 755 权限
2.在my_fonts解压字体包
3.进入 my_fonts 安装字体索引指令 yum install -y fontconfig mkfontscale
4.建立字体索引信息更新字体缓存
进入 my_fonts 目录安装字体,建立索引更新缓存
mkfontscale && mkfontdir && fc-cache -fv
5.查看字体是否安装成功 fc-list :lang=zh
安装以后解决linux乱码问题
5.如果转出来的pdf带有水印,需要特殊处理
public static void removeMark() {
try {
log.info("【开始加载去除水印】");
Class<?> aClass = Class.forName("com.aspose.words.zzXyu");
java.lang.reflect.Field zzYAC = aClass.getDeclaredField("zzZXG");
zzYAC.setAccessible(true);
java.lang.reflect.Field modifiersField = zzYAC.getClass().getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(zzYAC, zzYAC.getModifiers() & ~Modifier.FINAL);
zzYAC.set(null, new byte[]{76, 73, 67, 69, 78, 83, 69, 68});
log.info("【加载去除水印完成】");
} catch (Exception e) {
log.error("apose word :{}", e);
}
}
6.到此处理完成,真实接入过,如遇到问题可以私信,仅供学习参考,务做其他用途