如何实现文档在线预览?aspose轻松解决

现状:

目前市场上ERP、MES、CRM等系统大部分都包含有文件预览。Web浏览器要实现文件预览的功能,一般都需要服务器传回pdf文件流,才能在页面实现预览功能。那么pdf以外的文件就必须得先转成pdf文件才能实现。以下以aspose实现文件转为pdf文件。

项目中引入aspose依赖:

<dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-words</artifactId>
            <version>15.8.0</version>
        </dependency>

        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-cells</artifactId>
            <version>8.5.2</version>
        </dependency>

最好把jar包下载下来,放入本地maven库。

百度网盘链接 https://pan.baidu.com/s/10Rm2mic0Dam4EbOCLYK26g?pwd=s44e

提取码:s44e

license.xml放入项目中:

Springboot项目中结构如下图

<License>
  <Data>
    <Products>
      <Product>Aspose.Total for Java</Product>
      <Product>Aspose.Words for Java</Product>
    </Products>
    <EditionType>Enterprise</EditionType>
    <SubscriptionExpiry>20991231</SubscriptionExpiry>
    <LicenseExpiry>20991231</LicenseExpiry>
    <SerialNumber>23dcc79f-44ec-4a23-be3a-03c1632404e9</SerialNumber>
  </Data>
  <Signature>0nRuwNEddXwLfXB7pw66G71MS93gW8mNzJ7vuh3Sf4VAEOBfpxtHLCotymv1PoeukxYe31K441Ivq0Pkvx1yZZG4O1KCv3Omdbs7uqzUB4xXHlOub4VsTODzDJ5MWHqlRCB1HHcGjlyT2sVGiovLt0Grvqw5+QXBuinoBY0suX0=</Signature>
</License>

封装工具类:

import com.alibaba.excel.EasyExcel;
import com.aspose.cells.PdfSaveOptions;
import com.aspose.cells.Workbook;
import com.aspose.words.Document;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Map;



@Slf4j
@Component
public class FileUtil {
   

    /**
     * 文件下载方法
     *
     * @param filename 文件保存名
     * @param filePath 文件下载路径
     * @param res
     * @throws IOException
     */
    public static void downloadFile(String filename, String filePath, HttpServletResponse res) throws IOException {
        // 发送给客户端的数据
        OutputStream outputStream = res.getOutputStream();
        byte[] buff = new byte[1024];
        BufferedInputStream bis = null;
        // 读取filename
        bis = new BufferedInputStream(new FileInputStream(new File(filePath + filename)));
        int i = bis.read(buff);
        while (i != -1) {
            outputStream.write(buff, 0, buff.length);
            outputStream.flush();
            i = bis.read(buff);
        }
        outputStream.close();
    }

    public static void deleteFile(String filename, String filePath) {
        File file = new File(filePath + filename);
        if (file.exists()) {//文件是否存在
            file.delete();//删除文件
        }
    }


    

    /**
     * @Author WXK
     * @Description 返回预览pdf流
     * @Date 2021/3/11
     **/
    public static void previewFile1(String filePath, HttpServletResponse res) throws IOException {
        // 发送给客户端的数据
        OutputStream outputStream = res.getOutputStream();
        try {
            byte[] buff = new byte[1024];
            BufferedInputStream bis = null;
            // 读取filename
            bis = new BufferedInputStream(new FileInputStream(new File(filePath)));
            int i = bis.read(buff);
            while (i != -1) {
                outputStream.write(buff, 0, buff.length);
                outputStream.flush();
                i = bis.read(buff);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            outputStream.close();
        }


    }

    /**
     * @Author WXK
     * @Description 删除转换生成的pdf文件
     * @Date 2021/3/11
     **/
    public static void deleteFile1(String filePath) {
        File file = new File(filePath);
        if (file.exists()) {//文件是否存在
            file.delete();//删除文件
        }
    }


    


   

    public static boolean getLicense() {
        boolean result = false;
        try {
            InputStream is = Test.class.getClassLoader().getResourceAsStream("license.xml"); //  
            License aposeLic = new License();
            aposeLic.setLicense(is);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public static boolean getExcelLicense() {
        boolean result = false;
        try {
            InputStream is = Test.class.getClassLoader().getResourceAsStream("license.xml"); //  
            com.aspose.cells.License license = new com.aspose.cells.License();
            license.setLicense(is);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * @Author WXK
     * @Description word转 pdf
     * @Date 2021/3/12
     **/
    public static String doc2pdf(String fileName, String filePath) {

        if (!getLicense()) {          // 验证License 若不验证则转化出的pdf文档会有水印产生
            return null;
        }
        try {
            String oldFile = filePath + fileName;
            String newFile = oldFile.substring(0, oldFile.lastIndexOf("."))+".pdf";

            File file = new File(newFile);  //新建一个空白pdf文档
            FileOutputStream os = new FileOutputStream(file);
            Document doc = new Document(oldFile);                    //Address是将要被转化的word文档
            doc.save(os, SaveFormat.PDF);//全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换
            log.info("转换成功");  //转化用时
            return newFile;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * @Author WXK
     * @Description 上传文件时,word转pdf 保存在本地
     * @Date 2021/3/29  
     **/
    public static String doc2pdf(InputStream inputStream,String fileName, String filePath) {

        if (!getLicense()) {          // 验证License 若不验证则转化出的pdf文档会有水印产生
            return null;
        }
        try {
            String newFile = filePath + fileName;

            File file = new File(newFile);  //新建一个空白pdf文档
            FileOutputStream os = new FileOutputStream(file);
            Document doc = new Document(inputStream);                    //Address是将要被转化的word文档
            doc.save(os, SaveFormat.PDF);//全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换
            log.info("转换成功");  //转化用时
            return newFile;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * @Author WXK
     * @Description excel转pdf
     * @Date 2021/3/22
     **/
    public static String excelToPdf(String fileName, String filePath) throws IOException{

        if (!getExcelLicense()) {          // 验证License 若不验证则转化出的pdf文档会有水印产生
            return null;
        }
        FileOutputStream fileOS=null;
        try {
            String oldFile = filePath + fileName;
            String newFile = oldFile.substring(0, oldFile.lastIndexOf("."))+".pdf";
            File pdfFile = new File(newFile);// 输出路径
           /* Workbook wb = new Workbook(oldFile);// 原始excel路径
             fileOS = new FileOutputStream(pdfFile);
            wb.save(fileOS, SaveFormat.PDF);
            fileOS.flush();

            log.info("转换成功");*/

            Workbook wb = new Workbook(oldFile);// 原始excel路径
            

             fileOS = new FileOutputStream(newFile);
            PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
            pdfSaveOptions.setOnePagePerSheet(true);


            int[] autoDrawSheets={3};
            //当excel中对应的sheet页宽度太大时,在PDF中会拆断并分页。此处等比缩放。
            autoDraw(wb,autoDrawSheets);

            int[] showSheets={0};
            //隐藏workbook中不需要的sheet页。
            printSheetPage(wb,showSheets);
            wb.save(fileOS, pdfSaveOptions);
            fileOS.flush();
            fileOS.close();
            log.info("完毕");
            return newFile;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            fileOS.close();
        }
        return null;
    }


    /**
     * @Author WXK
     * @Description 上传文件时 excel转pdf保存在本地
     * @Date 2021/3/29  
     **/
    public static String excelToPdf(InputStream inputStream, String fileName,String filePath) throws IOException{

        if (!getExcelLicense()) {          // 验证License 若不验证则转化出的pdf文档会有水印产生
            return null;
        }
        FileOutputStream fileOS=null;
        try {
            String newFile = filePath + fileName;
            
            Workbook wb = new Workbook(inputStream);// 原始excel路径


            fileOS = new FileOutputStream(newFile);
            PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
            pdfSaveOptions.setOnePagePerSheet(true);


            int[] autoDrawSheets={3};
            //当excel中对应的sheet页宽度太大时,在PDF中会拆断并分页。此处等比缩放。
            autoDraw(wb,autoDrawSheets);

            int[] showSheets={0};
            //隐藏workbook中不需要的sheet页。
            printSheetPage(wb,showSheets);
            wb.save(fileOS, pdfSaveOptions);
            fileOS.flush();
            fileOS.close();
            log.info("完毕");
            return newFile;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            fileOS.close();
        }
        return null;
    }

    /**
     * 设置打印的sheet 自动拉伸比例
     * @param wb
     * @param page 自动拉伸的页的sheet数组
     */
    public static void autoDraw(Workbook wb,int[] page){
        if(null!=page&&page.length>0){
            for (int i = 0; i < page.length; i++) {
                wb.getWorksheets().get(i).getHorizontalPageBreaks().clear();
                wb.getWorksheets().get(i).getVerticalPageBreaks().clear();
            }
        }
    }


    /**
     * 隐藏workbook中不需要的sheet页。
     * @param wb
     * @param page 显示页的sheet数组
     */
    public static void printSheetPage(Workbook wb,int[] page){
        for (int i= 1; i < wb.getWorksheets().getCount(); i++)  {
            wb.getWorksheets().get(i).setVisible(false);
        }
        if(null==page||page.length==0){
            wb.getWorksheets().get(0).setVisible(true);
        }else{
            for (int i = 0; i < page.length; i++) {
                wb.getWorksheets().get(i).setVisible(true);
            }
        }
    }







    /**
     * @Author WXK
     * @Description 查看对应的.pdf文件是否存在
     * @Date 2021/3/12
     **/
    public static boolean checkFileExist(String filePath) {
        File file = new File(filePath);
        if (file.exists()) {//文件是否存在
            return true;
        }
        return false;
    }
}

controller层:

import com.shuangjia.constant.Constant;
import com.shuangjia.model.PeDownloadLog;
import com.shuangjia.model.PeFile;
import com.shuangjia.model.ResultEntity;
import com.shuangjia.model.UserSession;
import com.shuangjia.util.FileUtil;
import com.shuangjia.web.pepd.feginService.PeFileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;

import javax.activation.MimetypesFileTypeMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.UUID;
public class PeFileController {
	@Value("${upload.path}")
    private  String path;

    @Value("${upload.picture.path}")
    private  String uploadPath;


 @PostMapping("/previewFile")
    @ApiOperation("返回文件流")
    public void previewFile(@RequestBody PeFile po,HttpServletResponse response)throws IOException{
        String fileName=po.getFileName();

        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
        if("pdf".equalsIgnoreCase(suffix)){
            String type = new MimetypesFileTypeMap().getContentType(fileName);
            response.setHeader("Content-type",type);
            String newFileName = new String(fileName.getBytes("utf-8"), "iso-8859-1");
            // 设置扩展头,当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。
            response.setHeader("Content-Disposition", "attachment;filename=" + newFileName);
            FileUtil.downloadFile(fileName,path,response);

        }

        String filePath = path + fileName.substring(0,fileName.lastIndexOf(".")) + ".pdf";
        if( FileUtil.checkFileExist(filePath)){
            FileUtil.previewFile1(filePath,response);
        }else {
            String newFilePath=null;
            if("XLSX".equalsIgnoreCase(suffix) || "XLS".equalsIgnoreCase(suffix)){
                newFilePath=FileUtil.excelToPdf(fileName,path);
            }else {
                //DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF
                newFilePath = FileUtil.doc2pdf(fileName, path);
            }

         
            if(StringUtils.isNotBlank(newFilePath)){
                FileUtil.previewFile1(newFilePath,response);
            }
        }



    }



}

最后返回给前端页面的是一个pdf流

效果图:

关注公众号,Java面经、精品书籍、Spring全家桶、超多简历模板任你选择!

#Java##面试##简历#
九九八十一难 文章被收录于专栏

主要是工作中遇到的坑和一些项目中常见功能的实现

全部评论
感谢楼主分享
1 回复 分享
发布于 2023-02-26 17:27 四川

相关推荐

当谈到前端项目的性能优化策略时,有许多方法和技术可以考虑。以下是一些常见的性能优化策略:https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&amp;uuid=07d53be4cd034a4ab270d500feebcc8d压缩和合并文件:通过使用压缩工具和合并代码文件,可以减少HTTP请求的数量,从而提高网页加载速度。图片优化:使用适当的图像格式(如WebP),并优化图像大小,可以减少页面加载时间。延迟加载:通过延迟加载非关键内容(如图片、视频等),可以提高初始页面加载速度。缓存:使用浏览器缓存来存储静态资源,以减少对服务器的请求。减少重绘和重排:通过合理地使用CSS和布局技巧,可以减少浏览器的重绘和重排次数,从而提高页面渲染速度。使用CDN:将静态内容部署到内容分发网络(CDN)上,可以加快全球各地用户的网页加载速度。懒加载:只在需要时加载内容,例如仅当用户滚动到可见区域时再加载图片或其他资源。代码优化:通过减少不必要的代码、使用高效的算法和数据结构等方式来优化前端代码。RAIL模型:遵循RAIL模型(响应、动画、空闲和加载)来优化用户交互的响应速度和流畅性。使用缓存框架和工具:利用现有的缓存框架和工具,如Service&nbsp;Workers和LocalStorage,来提高应用程序的性能和响应速度。https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&amp;uuid=07d53be4cd034a4ab270d500feebcc8d
点赞 评论 收藏
分享
【2025秋招季】第一弹🔆害怕面试怎么办?🌻Hello大家好,我是不放弃的小延🏃‍♂️&nbsp;&nbsp;🌳时间过的飞快,转眼间就已经要找工作了,我哭死😭😭😭🌳从7月准备秋招到现在投了近千家公司,测评笔试做到吐!面试数百次!0offer!但看到有很多小伙伴说害怕面试,今天就想结合我浅薄的经验为小伙伴们打气加油!!!🌷你是不是也有这些问题?你担心自己收不到面试,又害怕自己收到面试?你是不是在担心自己表现不好,担心自己回答不上来问题,担心自己挂掉,担心自己被嘲笑…(无知的我甚至担心被录取该不该去?!?!😤)别担心!!!不用给自己制造太大的焦虑,因为刚开始大部分人都是这样!经过这么多次面试,我觉得面试就和上课回答问题一样,只要次数多了老师就像好哥们😌想到什么说什么,准备什么就说什么,面试官也是一样。而且大多数还是线上,还有充足的准备机会!🌷经过那么多次的面试,我发现,面试其实也是有套路的,来来回回问的就是那些问题。不管面试官问什么问题,其本质就是想了解你,想看看你是否能做好这个工作,所以这些问题并不难回答,只要根据我们的简历提前准备好了,就可以应对80%的面试!🌻下期我们将分享一下面试前的准备工作~点个关注我们明天再见👋 #你都收到了哪些公司的感谢信?# #面试时最害怕被问到的问题# #牛客创作赏金赛# (小伙伴们可以留下你们的问题,我会根据我遇到的情况为你出谋划策😄)
点赞 评论 收藏
分享
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务