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

news2025/1/11 10:19:49

一、引入依赖

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

    }

}

小姐姐

在这里插入图片描述

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

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

相关文章

从头开始的建材类电商小程序开发指南

在当今数字化时代&#xff0c;小程序已经成为了许多企业推广和销售的重要渠道。对于建筑材料行业来说&#xff0c;开发一个属于自己的小程序商城不仅可以提升产品曝光度&#xff0c;还可以提供更好的用户购物体验。下面&#xff0c;我们将逐步教你如何开发建筑材料行业小程序。…

佛山市举办2024年护士节庆祝活动

“作为一名在护理岗位上工作了39年的护士,能够在退休前参加这样温情的护士节活动,获得一个纪念胸章和一份荣誉证书,让我很感动!”第七届“南粤好护士”、佛山市第一人民医院急诊科护士长罗银秋说道。5月10日下午,由佛山市卫生健康局主办、佛山市护理学会协办、佛山市第一人民医…

CSS-页面导航栏实现-每文一言(过有意义的生活,做最好的自己)

&#x1f390;每文一言 过有意义的生活,做最好的自己 目录 &#x1f390;每文一言 &#x1f6d2;盒子模型 &#x1f453;外间距 (margin) &#x1f97c;边框 &#x1f45c;内边距 切换盒子模型计算方案&#xff1a; &#x1f3a2; 浮动布局 浮动特点 &#x1f3c6;导航…

wandb: - 0.000 MB of 0.011 MB uploaded持续出现的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Ubuntu系统下编译OpenCV4.8源码

OpenCV4.8源码编译与安装 其实很简单&#xff0c;只要三步即可搞定&#xff0c;第一步是下载指定版本的源码包&#xff1b;第二步是安装OpenCV4.8编译需要的编译器与第三方库支持&#xff1b;第三步就是编译OpenCV源码包生成安装文件并安装。 01下载OpenCV4.8源码包 在Ubunt…

智慧公厕,运用数据提升公共厕所管理水平!

随着城市人口的增加和生活水平的提高&#xff0c;公共厕所的管理变得越来越重要。传统的厕所管理方式已经无法满足人们对卫生、便利和舒适的需求。而智慧公厕作为新一代公厕管理方式&#xff0c;通过运用数据技术和大数据分析手段&#xff0c;彻底改变了公厕管理的模式&#xf…

【系统架构师】-案例篇(七)信息安全

某软件公司拟开发一套信息安全支撑平台&#xff0c;为客户的局域网业务环境提供信息安全保护。该支撑平台的主要需求如下&#xff1a; 1.为局域网业务环境提供用户身份鉴别与资源访问授权功能&#xff1b; 2.为局域网环境中交换的网络数据提供加密保护&#xff1b; 3.为服务…

真驱鸟农业专用插电款驱鸟器,防喜鹊、麻雀各种鸟类

成年喜鹊的栖息地非常多样化&#xff0c;它们常常在人类活动的区域出没&#xff0c;喜欢把鸟巢建在民宅旁边的大树上、旷野的高树上或者电线塔杆上。白天&#xff0c;它们会飞到农田等开阔的地方觅食&#xff0c;到了傍晚则会返回巢内栖息。 喜鹊食性杂&#xff0c;它们的食物组…

2008NOIP普及组真题 4. 立体图

线上OJ&#xff1a; 一本通-1977&#xff1a;【08NOIP普及组】立体图 核心思想&#xff1a; 本题采用模拟方法一个一个画小方块&#xff08;虽然画的是立体空间的积木&#xff0c;但本质还是在二维平面上画图形&#xff09; 本题的难点在于&#xff1a; 1、如何确定二维平面画…

传输层之 TCP 协议

TCP协议段格式 源/目的端口号&#xff1a;表示数据是从哪个进程来&#xff0c;到哪个进程去。 序号&#xff1a;发送数据的序号。 确认序号&#xff1a;应答报文的序号&#xff0c;用来回复发送方的。 4 位首部长度&#xff1a;一个 TCP 报头&#xff0c;长度是可变的&#xff…

产品想在网络媒体上做营销宣传推广有什么好方法?

作为公司宣传负责人,我深知产品在网络媒体上的营销推广对于品牌建设和市场扩张的重要性。然而,在过去,当我们想要在网络媒体上推广产品时,我面临了诸多挑战和困境。 以前,我常常需要直接联系各大网络媒体,从海量的信息中筛选出合适的媒体平台,然后逐一发送邮件、拨打电话甚至亲…

图片无损压缩工具-VIKY

一、前言 Viky v3.4是一款功能强大的图片压缩工具&#xff0c;它能够提供高效的图片无损压缩服务。通过使用独特的压缩算法&#xff0c;该软件在显著减小图片文件大小的同时&#xff0c;还保持了图像的清晰度和色彩饱和度&#xff0c;确保了图像质量的优异表现。 二、软件特点…

layui select 绑定onchange事件失效

layui select 绑定onchange事件失效 问题背景解决方案 问题背景 在日常工作中&#xff0c;可能会用到页面 freemaker 以及 layui 前端框架&#xff0c;这个时候直接在 select 上面绑定 onchange 事件往往是不生效的&#xff0c;错误的方式 这种方式给 select 绑定的 onchange…

深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f525; 引言&#x1f9f1; 原型基础⛓️ 原型链的形成&#x1f504; 修改原型的影响&#x1f3c1; 原型链的尽头为什么null标志着结束&#xff1f;实际意义 &#x1f310; &#x1f504; 继承的实现方式1. 原型链继承…

【ITK配准】第十九期 基于KernelBase样条的图像变形

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享ITK配准中基于KernelBase样条的图像变形,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 基于…

VMware虚拟机中Linux系统奔溃,怎么办?

一大早启动虚拟机准备开始工作&#xff0c;却遭遇到Linux系统崩溃&#xff0c;屏幕上显示以下错误提示&#xff1a; 这段文本看起来是来自系统引导时的日志信息&#xff0c;提到了一些关于文件系统的问题和建议。根据这段信息&#xff0c;似乎 /dev/sda1 分区中的文件系统存在一…

鲁教版六年级数学上册-笔记

文章目录 第一章 丰富的图形世界1 生活中的立体图形2 展开和折叠3 截一个几何体4 从三个方向看物体的形状 第二章 有理数及其运算1 有理数2 数轴3 绝对值4 有理数的加法5 有理数的减法6 有理数的加减混合运算7 有理数的乘法8 有理数的除法9 有理数的乘方10 科学计数法11 有理数…

探索无界知识:用 ChatGPT 的原理学习任何事物!

为避免文章重复&#xff0c;您的文本已通过更改句式、用词以及句子结构进行了修改。现在的文本应该能更好地满足去重的需求&#xff1a; 从ChatGPT原理出发&#xff0c;我们探讨GPT如何启发人类学习和构建个人知识体系。 1. 明确学习目标 机器学习必须依靠目标函数。同样&…

4.nginx.pid打开失败以及失效的解决方案

一. nginx.pid打开失败以及失效的解决方案 1.错误图片&#xff1a; 2.解决方法 步骤1&#xff1a;进入这个目录 /var/run/nginx,提示没有文件或目录&#xff0c;则使用mkdir创建这个目录。 步骤2&#xff1a;然后 ./nginx -s reload 运行,是一个无效的PID 步骤3&#xff1a;使…

如何挑选“好用”的工业APP

我们日常生活中每天都在使用各种生活类的APP,然而&#xff0c;当我们谈到工业APP时&#xff0c;很多人可能并不那么熟悉。工业APP&#xff0c;虽然不像生活类APP那样直接面向广大消费者&#xff0c;但在工业领域却扮演着至关重要的角色。 先简单认识下啥是工业APP? 工业APP是…