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

    }

}

小姐姐

相关推荐
xcl09255 小时前
北京24小时自助健身房系统软件开发实战:从架构到部署全流程指南
java·spring boot·架构
一 乐7 小时前
动漫书销售商城|基于springboot + vue动漫书销售商城(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
卓怡学长7 小时前
w214基于jsp知道特产网
java·intellij-idea
步行cgn7 小时前
Spring 注解使用详解
java·spring
一条小小yu7 小时前
Spring IoC的理解
java·后端·spring
落魄实习生8 小时前
Agent Scope Java 2.x 系列【7】工具使用
java·开发语言·ai
旺仔学长 哈哈8 小时前
springboot钓鱼爱好者交流平台APP设计与实现
java·spring boot·mysql·充电桩管理系统
自强的小白9 小时前
核心功能(Service接口)
java·mybatis
乌暮10 小时前
深入理解 Java 泛型:把「万能盒子」用对、用稳
java·开发语言·后端·学习