文章目录
- 1. 引入依赖
- 2. 注册工具类
- 3. 文件转换工具类
- 4. 文件预览工具类
- 5. 文件处理实现类
- 6. 文件处理入口
- 7. 配置类
- 8. 配置文件
- 9. 依赖目录+文件列表
- 10. 图片转换工具类
- 11. 测试连接
- 12. 效果图
- 12. 执行shell命令工具类补充
1. 引入依赖
下载 Aspose 的依赖 Jar 包可以通过一下仓库下载:Aspose 依赖下载
https://repository.aspose.com/repo/com/aspose/
<dependencies><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version></dependency><dependency><groupId>com.aspose.cells</groupId><artifactId>aspose-cells</artifactId><version>22.6</version><scope>system</scope><systemPath>${project.basedir}/src/main/resources/lib/aspose-cells-22.6.jar</systemPath></dependency><dependency><groupId>com.aspose.words</groupId><artifactId>aspose-words</artifactId><version>words-22.5-jdk17</version><scope>system</scope><systemPath>${project.basedir}/src/main/resources/lib/aspose-words-22.5-jdk17.jar</systemPath></dependency><dependency><groupId>aspose-slides</groupId><artifactId>aspose-slides</artifactId><version>slides-21.10-jdk16</version><scope>system</scope><systemPath>${project.basedir}/src/main/resources/lib/aspose-slides-21.10-jdk16.jar</systemPath></dependency><dependency><groupId>aspose-pdf</groupId><artifactId>aspose-pdf</artifactId><version>pdf-21.7</version><scope>system</scope><systemPath>${project.basedir}/src/main/resources/lib/aspose-pdf-21.7.jar</systemPath></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency><!-- web支持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
2. 注册工具类
package com.gblfy.office.utils;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Date;/*** aspose 注册* 仅供用于学习和交流,请勿做任何商业用途** @author xieqiumin* @since 2022-07-14*/
public abstract class AsposeRegister {/*** aspose-words:jdk17:22.5 版本*/public static void registerWord_v_22_5() throws Exception {Class<?> zzjXClass = Class.forName("com.aspose.words.zzjX");Constructor<?> constructor = zzjXClass.getDeclaredConstructors()[0];constructor.setAccessible(true);Object zzjXInstance = constructor.newInstance();// zzZ7OField zzZ7O = zzjXClass.getDeclaredField("zzZ7O");zzZ7O.setAccessible(true);zzZ7O.set(zzjXInstance, new Date(Long.MAX_VALUE));// zzBfField zzZfB = zzjXClass.getDeclaredField("zzZfB");zzZfB.setAccessible(true);Class<?> zzYP3Class = Class.forName("com.aspose.words.zzYP3");Field zzBfField = zzYP3Class.getDeclaredField("zzBf");zzBfField.setAccessible(true);zzZfB.set(zzjXInstance, zzBfField.get(null));// zzZjAField zzZjA = zzjXClass.getDeclaredField("zzZjA");zzZjA.setAccessible(true);zzZjA.set(null, zzjXInstance);Class<?> zzCnClass = Class.forName("com.aspose.words.zzCn");Field zzZyx = zzCnClass.getDeclaredField("zzZyx");zzZyx.setAccessible(true);zzZyx.set(null, 128);Field zzZ8w = zzCnClass.getDeclaredField("zzZ8w");zzZ8w.setAccessible(true);zzZ8w.set(null, false);}/*** aspose-cells:22.6 版本有效*/public static void registerExcel_v_22_6() throws Exception {String licenseExpiry = "20991231";// LicenseClass<?> licenseClass = Class.forName("com.aspose.cells.License");Field a = licenseClass.getDeclaredField("a");a.setAccessible(true);a.set(null, licenseExpiry);// k65Class<?> k65Class = Class.forName("com.aspose.cells.k65");Field k65A = k65Class.getDeclaredField("a");k65A.setAccessible(true);Constructor<?> constructor = k65Class.getDeclaredConstructors()[0];constructor.setAccessible(true);Object k65Instance = constructor.newInstance();k65A.set(null, k65Instance);Field k56C = k65Class.getDeclaredField("c");k56C.setAccessible(true);k56C.set(k65Instance, licenseExpiry);// e0nClass<?> e0nClass = Class.forName("com.aspose.cells.e0n");Field e0nA = e0nClass.getDeclaredField("a");e0nA.setAccessible(true);e0nA.set(null, false);}/*** aspose-slides:21.10 版本有效*/public static void registerPPT_v_21_10() throws Exception {Date licenseExpiry = new Date(Long.MAX_VALUE);Class<?> publicClass = Class.forName("com.aspose.slides.internal.of.public");Object publicInstance = publicClass.newInstance();Field publicTry = publicClass.getDeclaredField("try");publicTry.setAccessible(true);publicTry.set(null, publicInstance);Field publicInt = publicClass.getDeclaredField("int");publicInt.setAccessible(true);publicInt.set(publicInstance, licenseExpiry);Field publicNew = publicClass.getDeclaredField("new");publicNew.setAccessible(true);publicNew.set(publicInstance, licenseExpiry);Field publicIf = publicClass.getDeclaredField("if");publicIf.setAccessible(true);publicIf.set(publicInstance, 2);Class<?> nativeClass = Class.forName("com.aspose.slides.internal.of.native");Field nativeDo = nativeClass.getDeclaredField("do");nativeDo.setAccessible(true);nativeDo.set(null, publicInstance);}/*** aspose-pdf:21.7 版本有效*/public static void registerPdf_v_21_7() throws Exception {Date licenseExpiry = new Date(Long.MAX_VALUE);Class<?> l9yClass = Class.forName("com.aspose.pdf.l9y");Constructor<?> constructor = l9yClass.getDeclaredConstructors()[0];constructor.setAccessible(true);Object l9yInstance = constructor.newInstance();// lcField lc = l9yClass.getDeclaredField("lc");lc.setAccessible(true);lc.set(l9yInstance, licenseExpiry);// lyField ly = l9yClass.getDeclaredField("ly");ly.setAccessible(true);ly.set(l9yInstance, licenseExpiry);// l0ifField l0if = l9yClass.getDeclaredField("l0if");l0if.setAccessible(true);Class<?> l9nClass = Class.forName("com.aspose.pdf.l9n");Field lfField = l9nClass.getDeclaredField("lf");lfField.setAccessible(true);Object lf = lfField.get(null); // 处理枚举l0if.set(l9yInstance, lf);Class<?> l9yLfClass = Class.forName("com.aspose.pdf.l9y$lf");Field l9y$lf = l9yLfClass.getDeclaredField("lI");l9y$lf.setAccessible(true);l9y$lf.set(null, l9yInstance);Class<?> l19jClass = Class.forName("com.aspose.pdf.l19j");Field l19jlI = l19jClass.getDeclaredField("lI");l19jlI.setAccessible(true);l19jlI.set(null, 128);Field l19jLf = l19jClass.getDeclaredField("lf");l19jLf.setAccessible(true);l19jLf.set(null, false);}public static void registerAll() {try {registerWord_v_22_5();registerPPT_v_21_10();registerExcel_v_22_6();registerPdf_v_21_7();} catch (Exception e) {throw new RuntimeException("Aspose注册失败", e);}}
}
3. 文件转换工具类
package com.gblfy.office.utils;import com.aspose.cells.Workbook;
import com.aspose.slides.Presentation;
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.io.FileOutputStream;
import java.io.IOException;/*** 将office文件转成pdf** @author gblfy* @date 2022-11-05*/
@Slf4j
@Component
public class PdfFileConvertUtil {/*** excel 转 pdf** @param inputPath word文件path(全路径)* @param outPath pdf文件path(全路径)* @return*/public Boolean excel2pdf(String inputPath, String outPath) {FileOutputStream os = null;try {AsposeRegister.registerExcel_v_22_6();os = new FileOutputStream(outPath);// Address是将要被转化的excel表格Workbook workbook = new Workbook(inputPath);workbook.save(os, com.aspose.cells.SaveFormat.PDF);os.close();return true;} catch (Exception e) {log.error("转换失败!", e);if (os != null) {try {os.close();} catch (IOException e1) {e1.printStackTrace();}}return false;}}/*** ppt 转pdf** @param inputPath* @param outPath* @return*/public Boolean ppt2pdf(String inputPath, String outPath) {FileOutputStream os = null;try {AsposeRegister.registerPPT_v_21_10();os = new FileOutputStream(outPath);// Address是将要被转化的PPT幻灯片Presentation pres = new Presentation(inputPath);pres.save(os, com.aspose.slides.SaveFormat.Pdf);os.close();return true;} catch (Exception e) {log.error("转换失败!", e);if (os != null) {try {os.close();} catch (IOException e1) {e1.printStackTrace();}}return false;}}/*** word 转 pdf** @param inputPath word文件path(全路径)* @param outPath pdf文件path(全路径)* @return*/public Boolean word2pdf(String inputPath, String outPath) {FileOutputStream os = null;try {AsposeRegister.registerWord_v_22_5();os = new FileOutputStream(outPath);Document doc = new Document(inputPath);doc.save(os, SaveFormat.PDF);os.close();return true;} catch (Exception e) {log.error("转换失败!", e);if (os != null) {try {os.close();} catch (IOException e1) {e1.printStackTrace();}}return false;}}
}
4. 文件预览工具类
package com.gblfy.office.utils;import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;/*** pdf在吸纳预览方法** @author gblfy* @date 2022-11-05*/
public class PdfPreviewUtil {/*** 在线预览方法* 把转换后的pdf文件在网页上进行预览** @param response http响应* @param previewFile 文件的決定路径 例:/app/20191009133209_chgrpt.pdf* @throws Exception 格式转换过程中的异常*/public static void openPdf(HttpServletResponse response, String previewFile) throws Exception {InputStream is = new FileInputStream(previewFile);//响应文件的类型response.setContentType("application/pdf");response.setCharacterEncoding("UTF-8");OutputStream os = response.getOutputStream();int a = 0;byte[] b = new byte[10 * 1024];while ((a = is.read(b)) != -1) {os.write(b, 0, a);}is.close();os.close();os.flush();}}
5. 文件处理实现类
package com.gblfy.office.impl;import com.gblfy.office.utils.PdfFileConvertUtil;
import com.gblfy.office.utils.PdfPreviewUtil;
import com.gblfy.office.utils.PicUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;/*** office to pdf 预览** @author gblfy* @date 2022-11-05*/
@Slf4j
@Component
public class PdfServiceImpl {@Autowiredprivate PdfFileConvertUtil pdfFileConvertUtil;@Value("${aspose.officeDir}")private String officeDir;@Value("${aspose.pdfDir}")private String pdfDir;/*** 场景2:* office原文件目录和转换后的pdf是非同一个目录* office原文件名称和转换后的pdf是非同一个文件名称** @param inputFileName* @param response*/public void officeFileTopdf2(String inputFileName, HttpServletResponse response) {// 记录文件处理~开始时间long start = System.currentTimeMillis();// 文件后缀String suffix = inputFileName.substring(inputFileName.lastIndexOf(".") + 1);try {String officeFilePathAndFileName = officeDir + File.separator + inputFileName;log.info("officeFilePathAndFileName->>>{}:", officeFilePathAndFileName);// 初始化转换标志Boolean flag = false;// 初始化名称pdfString pdfFileName = "";// pdf文件校验if ("pdf".equals(suffix)) {pdfFileName = officeFilePathAndFileName;flag = true;log.info("pdfFileName ->>>{}:", pdfFileName);}// 非pdf文件校验if (!"pdf".equals(suffix)) {pdfFileName = pdfDir + File.separator + UUID.randomUUID().toString() + ".pdf";log.info("pdfFileName ->>>{}:", pdfFileName);}// pdf文件名称和路径采用和原ofice文件目录和文件名称一样处理,根据实际情况特殊处理即可if ("docx".equals(suffix)) {flag = pdfFileConvertUtil.word2pdf(officeFilePathAndFileName, pdfFileName);}if ("doc".equals(suffix)) {flag = pdfFileConvertUtil.word2pdf(officeFilePathAndFileName, pdfFileName);}if ("xlsx".equals(suffix)) {flag = pdfFileConvertUtil.excel2pdf(officeFilePathAndFileName, pdfFileName);}if ("xls".equals(suffix)) {flag = pdfFileConvertUtil.excel2pdf(officeFilePathAndFileName, pdfFileName);}if ("pptx".equals(suffix)) {flag = pdfFileConvertUtil.ppt2pdf(officeFilePathAndFileName, pdfFileName);}if ("ppt".equals(suffix)) {flag = pdfFileConvertUtil.ppt2pdf(officeFilePathAndFileName, pdfFileName);}if (flag) {//预览pdf文件PdfPreviewUtil.openPdf(response, pdfFileName);}} catch (Exception e1) {e1.printStackTrace();}// 记录文件处理~完成时间long end = System.currentTimeMillis();// 文件处理~耗时时间计算double castTime = (end - start) / 1000.0;log.info("pdf转换成功,共耗时:->{}:", castTime);}/*** 场景1:* office原文件目录和转换后的pdf是同一个目录* office原文件名称和转换后的pdf是同一个文件名称** @param inputFileName* @param response*/public void officeFileTopdf(String inputFileName, HttpServletResponse response) {// 记录文件处理~开始时间long start = System.currentTimeMillis();// 文件后缀String suffix = inputFileName.substring(inputFileName.lastIndexOf(".") + 1);try {String officeFilePathAndFileName = officeDir + File.separator + inputFileName;log.info("officeFilePathAndFileName->>>{}:", officeFilePathAndFileName);// 初始化转换标志Boolean flag = false;// 初始化名称pdfString pdfFileName = "";// pdf文件校验if ("pdf".equals(suffix)) {pdfFileName = officeFilePathAndFileName;log.info("pdfFileName ->>>{}:", pdfFileName);flag = true;}// pdf文件名称和路径采用和原ofice文件目录和文件名称一样处理,根据实际情况特殊处理即可if ("docx".equals(suffix)) {pdfFileName = officeFilePathAndFileName.replace(".docx", ".pdf");log.info("pdfFileName ->>>{}:", pdfFileName);flag = pdfFileConvertUtil.word2pdf(officeFilePathAndFileName, pdfFileName);}if ("doc".equals(suffix)) {pdfFileName = officeFilePathAndFileName.replace(".doc", ".pdf");log.info("pdfFileName ->>>{}:", pdfFileName);flag = pdfFileConvertUtil.word2pdf(officeFilePathAndFileName, pdfFileName);}if ("xlsx".equals(suffix)) {pdfFileName = officeFilePathAndFileName.replace(".xlsx", ".pdf");log.info("pdfFileName ->>>{}:", pdfFileName);flag = pdfFileConvertUtil.excel2pdf(officeFilePathAndFileName, pdfFileName);}if ("xls".equals(suffix)) {pdfFileName = officeFilePathAndFileName.replace(".xls", ".pdf");log.info("pdfFileName ->>>{}:", pdfFileName);flag = pdfFileConvertUtil.excel2pdf(officeFilePathAndFileName, pdfFileName);}if ("pptx".equals(suffix)) {pdfFileName = officeFilePathAndFileName.replace(".pptx", ".pdf");log.info("pdfFileName ->>>{}:", pdfFileName);flag = pdfFileConvertUtil.ppt2pdf(officeFilePathAndFileName, pdfFileName);}if ("ppt".equals(suffix)) {pdfFileName = officeFilePathAndFileName.replace(".ppt", ".pdf");log.info("pdfFileName ->>>{}:", pdfFileName);flag = pdfFileConvertUtil.ppt2pdf(officeFilePathAndFileName, pdfFileName);}if ("jpg".equals(suffix)) {pdfFileName = officeFilePathAndFileName.replace(".jpg", ".pdf");log.info("pdfFileName ->>>{}:", pdfFileName);flag = PicUtils.image2pdf(officeFilePathAndFileName, pdfFileName, suffix);}if ("png".equals(suffix)) {pdfFileName = officeFilePathAndFileName.replace(".png", ".pdf");log.info("pdfFileName ->>>{}:", pdfFileName);flag = PicUtils.image2pdf(officeFilePathAndFileName, pdfFileName, suffix);}if (flag) {//预览pdf文件PdfPreviewUtil.openPdf(response, pdfFileName);}} catch (Exception e) {e.printStackTrace();}// 记录文件处理~完成时间long end = System.currentTimeMillis();// 文件处理~耗时时间计算double castTime = (end - start) / 1000.0;log.info("pdf转换成功,共耗时:->{}:", castTime);}
// /**
// * 场景1:
// * office原文件目录和转换后的pdf是同一个目录
// * office原文件名称和转换后的pdf是同一个文件名称
// *
// * @param inputFileName
// * @param response
// */
// public void officeFileTopdf(String inputFileName, HttpServletResponse response) {
// // 记录文件处理~开始时间
// long start = System.currentTimeMillis();
// // 文件后缀
// String suffix = inputFileName.substring(inputFileName.lastIndexOf(".") + 1);
//
// try {
// String officeFilePathAndFileName = officeDir + File.separator + inputFileName;
// log.info("officeFilePathAndFileName->>>{}:", officeFilePathAndFileName);
//
// // 初始化转换标志
// Boolean flag = false;
// // 初始化名称pdf
// String pdfFileName = "";
//
// // pdf文件校验
// if ("pdf".equals(suffix)) {
// pdfFileName = officeFilePathAndFileName;
// log.info("pdfFileName ->>>{}:", pdfFileName);
// flag = true;
// }
//
// // pdf文件名称和路径采用和原ofice文件目录和文件名称一样处理,根据实际情况特殊处理即可
// if ("docx".equals(suffix)) {
// pdfFileName = officeFilePathAndFileName.replace(".docx", ".pdf");
// log.info("pdfFileName ->>>{}:", pdfFileName);
// flag = pdfFileConvertUtil.word2pdf(officeFilePathAndFileName, pdfFileName);
// }
// if ("doc".equals(suffix)) {
// pdfFileName = officeFilePathAndFileName.replace(".doc", ".pdf");
// log.info("pdfFileName ->>>{}:", pdfFileName);
// flag = pdfFileConvertUtil.word2pdf(officeFilePathAndFileName, pdfFileName);
// }
//
// if ("xlsx".equals(suffix)) {
// pdfFileName = officeFilePathAndFileName.replace(".xlsx", ".pdf");
// log.info("pdfFileName ->>>{}:", pdfFileName);
// flag = pdfFileConvertUtil.excel2pdf(officeFilePathAndFileName, pdfFileName);
// }
// if ("xls".equals(suffix)) {
// pdfFileName = officeFilePathAndFileName.replace(".xls", ".pdf");
// log.info("pdfFileName ->>>{}:", pdfFileName);
// flag = pdfFileConvertUtil.excel2pdf(officeFilePathAndFileName, pdfFileName);
// }
// if ("pptx".equals(suffix)) {
// pdfFileName = officeFilePathAndFileName.replace(".pptx", ".pdf");
// log.info("pdfFileName ->>>{}:", pdfFileName);
// flag = pdfFileConvertUtil.ppt2pdf(officeFilePathAndFileName, pdfFileName);
// }
// if ("ppt".equals(suffix)) {
// pdfFileName = officeFilePathAndFileName.replace(".ppt", ".pdf");
// log.info("pdfFileName ->>>{}:", pdfFileName);
// flag = pdfFileConvertUtil.ppt2pdf(officeFilePathAndFileName, pdfFileName);
// }
// if (flag) {
// response.setCharacterEncoding("UTF-8");
// response.setContentType("application/pdf");
// byte[] buf = new byte[8 * 1024];
// int len = 0;
// try {
// InputStream is = new FileInputStream(pdfFileName);
// OutputStream os = response.getOutputStream();
// while ((len = is.read(buf, 0, buf.length)) != -1) {
// os.write(buf, 0, len);
// }
// is.close();
// os.close();
// os.flush();
// } finally {
// try {
// deleteFile(officeFilePathAndFileName);
// deleteFile(pdfFileName);
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// // 记录文件处理~完成时间
// long end = System.currentTimeMillis();
// // 文件处理~耗时时间计算
// double castTime = (end - start) / 1000.0;
// log.info("pdf转换成功,共耗时:->{}:", castTime);
// }// /**
// * 删除文件
// *
// * @param filePath 文件
// * @return
// */
// public static boolean deleteFile(String filePath) {
// boolean flag = false;
// File file = new File(filePath);
// // 路径为文件且不为空则进行删除
// if (file.isFile() && file.exists()) {
// file.delete();
// flag = true;
// }
// return flag;
// }
}
6. 文件处理入口
package com.gblfy.office.controller;import com.gblfy.office.impl.PdfServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;/*** office file to pdf 预览** @author gblfy* @date 2022-11-05*/
@RestController
public class PdfPreviewController {@Autowiredprivate PdfServiceImpl pdfService;/*** 测试链接:* http://localhost/officeFileTopdf/7-1207-26公司元旦放假通知范文Word模板.docx* http://localhost/officeFileTopdf/20228751.xlsx* http://localhost/officeFileTopdf/小清新PPT.pptx* http://localhost/officeFileTopdf/预览图_千图网_编号35522533.jpg*/@GetMapping("/officeFileTopdf/{fileName}")public void officeFileTopdf(@PathVariable String fileName, HttpServletResponse response) {pdfService.officeFileTopdf(fileName, response);}
}
7. 配置类
package com.gblfy.office.config;import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** SpringMvc通用配置** @author gblfy* @date 2022-04-06*/
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {@Value("${local.path}")private String path;/*** 文件上传路径配置** @param registry*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {/** 本地文件上传路径 */registry.addResourceHandler("/f/**").addResourceLocations("file:" + path);}/*** 跨域配置*/@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOriginPatterns("*").allowedHeaders(CorsConfiguration.ALL).allowedMethods(CorsConfiguration.ALL).allowCredentials(true).maxAge(3600); // 1小时内不需要再预检(发OPTIONS请求)}// 统一注解,解决前后端交互Long类型精度丢失的问题@Beanpublic ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {ObjectMapper objectMapper = builder.createXmlMapper(false).build();//全局配置序列化返回json处理SimpleModule simpleModule = new SimpleModule();//json Long ==>StringsimpleModule.addSerializer(Long.class, ToStringSerializer.instance);objectMapper.registerModule(simpleModule);return objectMapper;}
}
8. 配置文件
application.yml
server:port: 80
local:path: D:/ht/outfileaspose:officeDir: D:/ht/officefilepdfDir: D:/ht/outpdf
9. 依赖目录+文件列表
10. 图片转换工具类
package com.gblfy.office.utils;import com.aspose.pdf.Document;
import com.aspose.pdf.Image;
import com.aspose.pdf.Page;
import com.aspose.pdf.SaveFormat;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;/*** 图片 to pdf 预览** @author gblfy* @date 2022-11-05*/
public class PicUtils {public static void main(String[] args) throws Exception {String source = "D:\\ht\\officefile\\预览图_千图网_编号35522533.jpg";String target = "D:\\ht\\officefile\\预览图_千图网_编号35522533.pdf";image2pdf(source, target, "jpg");}/*** 图片转PDF** @param sourcePath* @param targetPath* @param imgType* @throws IOException*/public static boolean image2pdf(String sourcePath, String targetPath, String imgType) {ByteArrayOutputStream baos = null;ByteArrayInputStream bais = null;try {AsposeRegister.registerPdf_v_21_7();//创建文档Document doc = new Document();//新增一页Page page = doc.getPages().add();//设置页边距page.getPageInfo().getMargin().setBottom(0);page.getPageInfo().getMargin().setTop(0);page.getPageInfo().getMargin().setLeft(0);page.getPageInfo().getMargin().setRight(0);//创建图片对象Image image = new Image();BufferedImage bufferedImage = ImageIO.read(new File(sourcePath));//获取图片尺寸int height = bufferedImage.getHeight();int width = bufferedImage.getWidth();baos = new ByteArrayOutputStream();ImageIO.write(bufferedImage, imgType, baos);baos.flush();bais = new ByteArrayInputStream(baos.toByteArray());image.setImageStream(bais);//设置pdf页的尺寸与图片一样page.getPageInfo().setHeight(height);page.getPageInfo().setWidth(width);//添加图片page.getParagraphs().add(image);//保存doc.save(targetPath, SaveFormat.Pdf);baos.close();bais.close();return true;} catch (Exception e) {try {baos.close();bais.close();e.printStackTrace();return false;} catch (IOException e2) {e2.printStackTrace();}}return false;}}
11. 测试连接
/*** 测试链接:* http://localhost/wordtopdf/7-1207-26公司元旦放假通知范文Word模板.docx* http://localhost/wordtopdf/20228751.xlsx* http://localhost/wordtopdf/小清新PPT.pptx*/
12. 效果图
12. 执行shell命令工具类补充
package com.gblfy.office.utils;import org.apache.commons.io.IOUtils;import javax.servlet.http.HttpServletResponse;
import java.io.*;/*** @@author gblfy* @Date : 2022-11-05 11:20* @describe: 文档在线预览* <p>* 服务器环境:Linux环境* 现支持文档类型: Excel word ppt pdf*/
public class ExecuteLinuxShellUtil {private static ExecuteLinuxShellUtil linuxPageDIsplsyFileUtil;public static synchronized ExecuteLinuxShellUtil getSwitchUtil() {if (linuxPageDIsplsyFileUtil == null) {linuxPageDIsplsyFileUtil = new ExecuteLinuxShellUtil();}return linuxPageDIsplsyFileUtil;}/*** 文档在线预览** @param response* @param fileStoragePath 文件存储路径 (前段获取文件存储路径返给后台)* @param beforeConversion 文件名(必须带文件后缀名,这里指的就是文件全名称)* @throws Exception*/public void conversionFile(HttpServletResponse response, String fileStoragePath, String beforeConversion) throws Exception {//文件存储路径//fileStoragePath ="/app/";//转换前的文件名//beforeConversion ="20191009133209lis_chgrpt.docx";String fileNamePath = fileStoragePath + beforeConversion;File file = new File(fileNamePath);if (!file.exists()) {System.err.println("库存中没有指定文件。。。。");return;}//获取到文件名String interceptFileName = beforeConversion.substring(0, beforeConversion.lastIndexOf("."));//截取文件后缀名String fileNameSuffix = beforeConversion.substring(beforeConversion.lastIndexOf(".") + 1);String command = null;if ("pdf".equals(fileNameSuffix)) {/*** 在线预览方法*/PdfPreviewUtil.openPdf(response, fileStoragePath + interceptFileName + ".pdf");} else if ("doc".equals(fileNameSuffix) || "docx".equals(fileNameSuffix)|| "xls".equals(fileNameSuffix) || "xlsx".equals(fileNameSuffix)|| "ppt".equals(fileNameSuffix) || "pptx".equals(fileNameSuffix)) {//文件格式转换命令 unoconv插件实现command = "/opt/libreoffice6.3/program/soffice --headless --invisible --convert-to pdf " + fileNamePath;//格式转换+在线预览formatConverAndPreview(command, response, fileStoragePath, interceptFileName);} else {System.err.println("暂不支持该类型文件在线预览!!!");return;}}/*** 格式转换+在线预览 方法** @param command 文件格式转换命令 例:/usr/bin/unoconv -f pdf /app/1.pptx* @param response http响应网页,实现在线预览* @param fileStoragePath 准备文件存放路径 例:/app/* @param interceptFileName 文件名 例: 1.pptx* @throws Exception*/public void formatConverAndPreview(String command,HttpServletResponse response,String fileStoragePath,String interceptFileName) throws Exception {/*** 执行shell命令,格式转换方法*///String temp ="/usr/bin/unoconv -f pdf " + command;executeCommand(command);/*** 在线预览方法*/PdfPreviewUtil.openPdf(response, fileStoragePath + interceptFileName + ".pdf");}/*** 执行shell命令* <p>* 統一把文件格式转换成pdf文件** @param command 文件格式转换命令* 例1:/usr/bin/unoconv -f pdf /app/1.pptx* 例2:/opt/libreoffice6.3/program/soffice --headless --invisible --convert-to pdf /app/1.pptx*/private static void executeCommand(String command) {StringBuffer output = new StringBuffer();Process process;InputStreamReader inputStreamReader = null;BufferedReader reader = null;try {process = Runtime.getRuntime().exec(command);process.waitFor();inputStreamReader = new InputStreamReader(process.getInputStream(), "UTF-8");reader = new BufferedReader(inputStreamReader);String line = "";while ((line = reader.readLine()) != null) {output.append(line + "\n");}//p.destroy();//这个一般不需要} catch (Exception e) {e.printStackTrace();} finally {IOUtils.closeQuietly(reader);IOUtils.closeQuietly(inputStreamReader);}}}