springboot word excel ppt 图片aspose 转换PDF 在线预览

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

文章目录

            • 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);}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构制图:工具与方法论

简介&#xff1a; 软件工程也是工程&#xff0c;因此传统工程制图的一些基本理论&#xff0c;在软件行业同样适用。但另一方面&#xff0c;软件与实体制造业之间还是有着本质区别&#xff0c;所以在制图方面的需求和方式也大相径庭&#xff0c;无法直接套用。作为软件行业的从业…

Gartner:云安全的未来,是安全访问服务边缘架构

作者 | Gartner高级研究总监 Evan Zeng编辑 | 宋 慧头图 | 付费下载于东方ICGartner最新的“安全领域新兴技术及趋势影响雷达”&#xff08;Emerging Technologies and Trends Impact Radar: Security&#xff09;显示&#xff0c;安全服务及接入边缘技术具有极高重要性&#x…

奥哲孟凡俊:低代码平台对当代企业智能管理的支撑

简介&#xff1a; 导读&#xff1a;在数字化时代&#xff0c;业务拓展快&#xff0c;迭变快将成为常态和主流&#xff0c;企业数字化转型除了企业内部协同提效之外&#xff0c;基于多项底层技术框架的低代码平台更是智能协作不可或缺的底层支持&#xff0c;奥哲高级副总裁兼奥哲…

yarn 不是内部或外部命令,也不是可运行的程序(亲测可用)

这个时候报 yarn 不是内部或外部命令 相信你的npm已经安装好了 方法一&#xff08;网上大多数是这个&#xff09;&#xff1a; npm install -g yarn方法二&#xff08;我的是这个&#xff09;&#xff1a;配置环境变量&#xff08;你的yarn地址直接复制上去就好了&#xff09…

基于 Flink + Hive 构建流批一体准实时数仓

简介&#xff1a; 想要搭建流式链路就必须得抛弃现有的 Hive 数仓吗&#xff1f;并不是&#xff0c;借助 Flink 可以实现已有的 Hive 离线数仓准实时化。本文整理自 Apache Flink Committer、阿里巴巴技术专家李劲松的分享&#xff0c;文章将分析当前离线数仓实时化的难点&…

腾讯云~kafka伪集群搭建

文章目录一、zookeeper伪集群搭建1. 下载安装包2. 解压安装包3. 创建目录4. 修改配置文件5. 修改dataDir&#xff0c;clientPort两个配置项5. 在data目录下创建myid文件6. 复制多个zookeeper7. 修改内存大小8. 启动zookeper9. 查看zookeeper运行状态二、kafka 伪集群搭建2.1. 下…

脚本征集大赛开启啦!100%有奖!

对一个程序爱好者来说&#xff0c;最酷的事情莫非就是用你喜欢的语言一步步实现你的idea&#xff0c; 现在用 CSDN 浏览器助手插件&#xff0c; 不仅能提升浏览器效率&#xff0c;还能在上面开发黑科技脚本&#xff0c;帮助你实现各种 idea~

蚂蚁御术:我的前端十年成长之路

我是御术&#xff0c;10年北邮毕业参加工作至今&#xff0c;刚好10年。一直觉得自己特别幸运&#xff0c;一路走来遇到了那么多好人好事&#xff0c;有机会一同做了点事情&#xff0c;由衷感激家人朋友们的支持和帮助。 自以为每一个人的发展轨迹都是不可复制的&#xff0c;过…

看动画学算法之:排序-基数排序

简介 之前的文章我们讲了count排序&#xff0c;但是count排序有个限制&#xff0c;因为count数组是有限的&#xff0c;如果数组中的元素范围过大&#xff0c;使用count排序是不现实的&#xff0c;其时间复杂度会膨胀。 而解决大范围的元素排序的办法就是基数排序。 基数排序…

mPaaS-RPC 拦截器各种场景下的使用指南

简介&#xff1a; RPC拦截器机制在preHandle、postHandle、exceptionHandle以及H5等场景中的应用 mPaaS 移动网关服务&#xff08;Mobile Gateway Service&#xff0c;简称 MGS&#xff09;作为 mPaas 最重要的组件之一&#xff0c;连接了移动客户端与服务端&#xff0c;简化了…

数据之光 · 安全未来 | 第四届中国数据安全治理高峰论坛圆满召开!

摘要&#xff1a;5月13日&#xff0c;2021DSG峰会在京盛大开幕&#xff0c;共推数据安全治理实践落地&#xff0c;共商数据安全发展未来&#xff01; 一、五年四届&#xff0c;峰会再启 2021年5月13日&#xff0c;“第四届中国数据安全治理高峰论坛”在北京香格里拉饭店圆满召…

Sentinel-Go 集成 Nacos 实现外部动态数据源

简介&#xff1a; 2020年&#xff0c;Sentinel 推出 Go 原生版本Sentinel-Golang&#xff0c;在云原生领域继续突破。本文将从实际出发 结合案例说明 在Sentinel-Golang中如何集成Nacos&#xff0c;使其做为外部动态数据源&#xff0c;将流控规则存储在nacos中&#xff0c;并且…

前端如何快速上手 Web 3D 游戏的开发

简介&#xff1a; 本文以「余额宝3D跑酷游戏」为例&#xff0c;介绍了前端如何快速上手 Web 3D 游戏的开发。 作者 | RichLab楺楺 诚空 本文以「余额宝3D跑酷游戏」为例&#xff0c;介绍了前端如何快速上手 Web 3D 游戏的开发。跑酷游戏是余额宝七周年的主玩法&#xff0c;用户…

vue+element ui后台返回数据为数字,前台转化成对应的中文显示在表格中

关于根据后台数字显示相应的文字&#xff0c;文档中没有详细说明&#xff0c;所以写这篇博客记录一下。 这里主要介绍三种方法&#xff0c;可以自己的需要选择哦 先放个效果图吧&#xff08;先说明一下0表示是&#xff0c;1代表否&#xff09; 方法一&#xff1a;调用method…

浪潮云发布全新“1231”业务战略,打造“一朵分布式云”

编辑 | 宋 慧 出品 | CSDN云计算 头图 | 浪潮云业务战略发布会现场图 在政务云必提浪潮云的十年之后&#xff0c;2021年5月14日&#xff0c;浪潮云发布了全新业务战略“1231”&#xff0c;浪潮“分布式云”行动计划首次亮相。 数采、数算、数用一体化 浪潮云“1231”战略正式发…

一文快速入门分库分表(必修课)

之前有不少刚入坑 Java 的粉丝留言&#xff0c;想系统的学习一下分库分表相关技术&#xff0c;可我一直没下定决心搞&#xff0c;眼下赶上公司项目在使用 sharding-jdbc 对现有 MySQL 架构做分库分表的改造&#xff0c;所以借此机会出一系分库分表落地实践的文章&#xff0c;也…

element ui tabs切换刷新数据

文章目录1. 在线调试2. 监听事件3. 结论1. 在线调试 2. 监听事件 监听分析 3. 结论 根据index做不同的操作&#xff0c;例如查询表格列表

搜索引擎新架构:与SQL不得不说的故事

阿里巴巴搜索引擎HA3架构 1.HA3架构分为在线和离线两部分 • 在线是一个传统的2层服务架构&#xff0c;分别叫做QRS和search。QRS负责接受用户请求&#xff0c;做一些简单处理之后把请求发给下面的search节点&#xff0c;search节点负责加载索引并完成检索&#xff0c;最终由Q…

面试90%都会翻车的高可用+高并发+负载均衡架构设计 !

很多人面试的时候被问到一个让人特别手足无措的问题&#xff1a;你的系统如何支撑高并发&#xff1f;对于一个公司而言&#xff0c;“为什么要高可用”关于负载均衡架构设计你了解多少&#xff1f;大多数同学被问到这个问题压根儿没什么思路去回答&#xff0c;不知道从什么地方…

数据湖 VS 数据仓库之争?阿里提出大数据架构新概念:湖仓一体

作者 |关涛、李睿博、孙莉莉、张良模、贾扬清&#xff08;from 阿里云智能计算平台&#xff09; 黄波、金玉梅、于茜、刘子正&#xff08;from 新浪微博机器学习研发部&#xff09; 编者按 随着近几年数据湖概念的兴起&#xff0c;业界对于数据仓库和数据湖的对比甚至争论就…