20240510每日后端---聊聊文件预览,doc,image,ppt转PDF预览

一、引入依赖

    <dependency>
        <groupId>com.aspose</groupId>
        <artifactId>aspose-words</artifactId>
        <version>15.8</version>
    </dependency>
    <dependency>
        <groupId>com.aspose</groupId>
        <artifactId>cracked</artifactId>
        <version>21.8</version>
    </dependency>

二、引入工具类

import com.aspose.words.FontSettings;

import com.aspose.words.License;

import com.aspose.words.SaveFormat;

import com.itextpdf.text.Document;

import com.itextpdf.text.Image;

import com.itextpdf.text.PageSize;

import com.itextpdf.text.pdf.PdfPCell;

import com.itextpdf.text.pdf.PdfPTable;

import com.itextpdf.text.pdf.PdfWriter;

import org.apache.poi.xslf.usermodel.*;

import java.awt.;
import java.awt.image.BufferedImage;
import java.io.
;

import java.util.List;

public class PreviewUtil {

/**
 * @param inputStream  源文件输入流
 * @param outputStream pdf文件输出流
 **/
public static boolean imgToPdf(InputStream inputStream, OutputStream outputStream) {

    Document document = null;

    try {

        // 创建文档,设置PDF页面的大小 A2-A9, 个人觉得A3最合适
        document = new Document(PageSize.A3, 20, 20, 20, 20);

        // 新建pdf文档,具体逻辑看.getInstance方法
        PdfWriter.getInstance(document, outputStream);

        document.open();
        document.newPage();

        // 将文件流转换为字节流,便于格式转换
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] bytes = new byte[1024];
        int length = 0 ;
        while (-1 != (length = bufferedInputStream.read(bytes))) {
            byteArrayOutputStream.write(bytes, 0, length);
        }

        // 处理img图片
        Image image = Image.getInstance(byteArrayOutputStream.toByteArray());

        float height = image.getHeight();
        float width = image.getWidth();

        float percent = 0.0f;
        // 设置像素或者长宽高,将会影响图片的清晰度,因为只是对图片放大或缩小
        if (height > width) {
            // A4 - A9
            percent = PageSize.A6.getHeight() / height * 100;
        } else {
            percent = PageSize.A6.getWidth() / width * 100;
        }

        image.setAlignment(Image.MIDDLE);
        image.scalePercent(percent);

        // 将图片放入文档中,完成pdf转换
        document.add(image);
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        try {
            if (document != null) {
                document.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    return true;
}

/**
 * @param inputStream  源文件输入流
 * @param outputStream pdf文件输出流
 **/
public static boolean wordTopdfByAspose(InputStream inputStream, OutputStream outputStream) {

    // 验证License 若不验证则转化出的pdf文档会有水印产生
    if (!getLicense()) {
        return false;
    }
    try {
        // 将源文件保存在com.aspose.words.Document中,具体的转换格式依靠里面的save方法
        com.aspose.words.Document doc = new com.aspose.words.Document(inputStream);

        // 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,EPUB, XPS, SWF 相互转换
        doc.save(outputStream, SaveFormat.PDF);

        System.out.println("word转换完毕");
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }finally {
        if (outputStream != null) {
            try {
                outputStream.flush();
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return true;

}

// 官方文档的要求 无需理会
public static boolean getLicense() {
    boolean result = false;
    try {
        String s = "<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>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>";
        ByteArrayInputStream is = new ByteArrayInputStream(s.getBytes());
        License aposeLic = new License();
        aposeLic.setLicense(is);
        result = true;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

/**
 * @param inputStream  源文件输入流
 * @param outputStream pdf文件输出流
 **/
public static boolean excelToPdf(InputStream inputStream, OutputStream outputStream) {
    // 验证License 若不验证则转化出的pdf文档会有水印产生
    if (!getExeclLicense()) {
        return false;
    }
    try {
        com.aspose.cells.Workbook wb = new com.aspose.cells.Workbook(inputStream);// 原始excel路径

        com.aspose.cells.PdfSaveOptions pdfSaveOptions = new com.aspose.cells.PdfSaveOptions();
        pdfSaveOptions.setOnePagePerSheet(false);


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

        int[] showSheets={0};
        //隐藏workbook中不需要的sheet页。
        printSheetPage(wb,showSheets);
        wb.save(outputStream, pdfSaveOptions);
        outputStream.flush();
        outputStream.close();
        System.out.println("excel转换完毕");
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return true;
}


/**
 * 设置打印的sheet 自动拉伸比例
 * @param wb
 * @param page 自动拉伸的页的sheet数组
 */
public static void autoDraw(com.aspose.cells.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(com.aspose.cells.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);
        }
    }
}

public static boolean getExeclLicense() {
    boolean result = false;
    try {
        String s = "<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>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>";
        ByteArrayInputStream is = new ByteArrayInputStream(s.getBytes());
        com.aspose.cells.License aposeLic = new com.aspose.cells.License();
        aposeLic.setLicense(is);
        result = true;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}


/**
 *  pptxToPdf
 * @param inputStream
 * @param outputStream
 * @return
 */
public static boolean pptxToPdf(InputStream inputStream, OutputStream outputStream) {

    Document document = null;

    XMLSlideShow slideShow = null;

    PdfWriter pdfWriter = null;

    try {

        slideShow = new XMLSlideShow(inputStream);

        Dimension dimension = slideShow.getPageSize();

        document = new Document();

        pdfWriter = PdfWriter.getInstance(document, outputStream);

        document.open();

        PdfPTable pdfPTable = new PdfPTable(1);

        List<XSLFSlide> slideList = slideShow.getSlides();

        for (int i = 0, row = slideList.size(); i < row; i++) {

            XSLFSlide slide = slideList.get(i);

            // 设置字体, 解决中文乱码
            for (XSLFShape shape : slide.getShapes()) {
                XSLFTextShape textShape = (XSLFTextShape) shape;

                for (XSLFTextParagraph textParagraph : textShape.getTextParagraphs()) {
                    for (XSLFTextRun textRun : textParagraph.getTextRuns()) {
                        textRun.setFontFamily("宋体");
                    }
                }
            }

            BufferedImage bufferedImage = new BufferedImage((int)dimension.getWidth(), (int)dimension.getHeight(), BufferedImage.TYPE_INT_RGB);

            Graphics2D graphics2d = bufferedImage.createGraphics();

            graphics2d.setPaint(Color.white);
            graphics2d.setFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 12));

            slide.draw(graphics2d);

            graphics2d.dispose();

            Image image = Image.getInstance(bufferedImage, null);
            image.scalePercent(50f);

            // 写入单元格
            pdfPTable.addCell(new PdfPCell(image, true));
            document.add(image);
        }
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        if (document != null) {
            document.close();
        }
        if (pdfWriter != null) {
            pdfWriter.close();
        }
    }
    System.out.println("pptx转换完毕");
    return true;
}}

三、调用工具类

public void pdfPreview (@RequestParam("fileId") String fileId, HttpServletResponse response){
    SysFileInfo sysFileInfo = projectInfoService.getPdfByFileId(fileId);
    byte[] fileBytes = FileUtilsNew.getFileByteByUrl(sysFileInfo.getFileUrl());
    ByteArrayInputStream byteArrayInputStream = null;
    ByteArrayOutputStream byteArrayOutputStream=null;
    ByteArrayInputStream bais=null;
    BufferedInputStream bin=null;
    PdfReader reader=null;
    try {
        byteArrayInputStream=new ByteArrayInputStream(fileBytes);
        byteArrayOutputStream=new ByteArrayOutputStream();
        boolean needSwitchFlag=true;
        byte[] byteArray=new byte[1024];

        if (needSwitchFlag){
            String typeBig = sysFileInfo.getFileSuffix();
            if (typeBig.contains("doc")){
                    PreviewUtil.wordTopdfByAspose(byteArrayInputStream, byteArrayOutputStream);
            }
            if (typeBig.contains("xls")){
                PreviewUtil.excelToPdf(byteArrayInputStream, byteArrayOutputStream);
            }
            String[] imgType = new String[]{"jpg", "png", "jpeg", "bmp"};
            //判断包含图片类型
            if (Arrays.asList(imgType).contains(typeBig)) {
                PreviewUtil.imgToPdf(byteArrayInputStream, byteArrayOutputStream);
            }
            String[] pptType = new String[]{"ppt", "pptx"};
            if (Arrays.asList(pptType).contains(typeBig)) {
                PreviewUtil.pptxToPdf(byteArrayInputStream, byteArrayOutputStream);

            }
            byteArray = byteArrayOutputStream.toByteArray();
        }else{
            byteArray=fileBytes;
        }
        response.setContentType("application/pdf;charset=utf-8");
        response.setCharacterEncoding(UTF_8);
        bais = new ByteArrayInputStream(byteArray);
        bin = new BufferedInputStream(bais);
        reader = new PdfReader(bin);
        PdfStamper stamper = new PdfStamper(reader,response.getOutputStream());
        PdfGState gs = new PdfGState();
        gs.setFillOpacity(1f);// 设置透明度
        stamper.close();
    }catch (Exception e){
        log.error("文件预览异常",e);
    }finally {
        try {
            if(byteArrayInputStream!=null){
                byteArrayInputStream.close();
            }
        }catch (Exception e){
            log.error("文件流关闭失败",e);
        }
        try {
            if(byteArrayOutputStream!=null){
                byteArrayOutputStream.close();
            }
        }catch (Exception e){
            log.error("文件流关闭失败",e);
        }
        try {
            if(bais!=null){
                bais.close();
            }
        }catch (Exception e){
            log.error("文件流关闭失败",e);
        }
        try {
            if(bin!=null){
                bin.close();
            }
        }catch (Exception e){
            log.error("文件流关闭失败",e);
        }
        try {
            if(reader!=null){
                reader.close();
            }
        }catch (Exception e){
            log.error("文件流关闭失败",e);
        }

    }

}

小姐姐

相关推荐
Yaml41 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~1 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616881 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7891 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java2 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
睡觉谁叫~~~2 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
程序媛小果2 小时前
基于java+SpringBoot+Vue的旅游管理系统设计与实现
java·vue.js·spring boot
小屁孩大帅-杨一凡3 小时前
java后端请求想接收多个对象入参的数据
java·开发语言
java1234_小锋3 小时前
使用 RabbitMQ 有什么好处?
java·开发语言
TangKenny3 小时前
计算网络信号
java·算法·华为