精华内容
下载资源
问答
  • Linux平台PPT转图片(Python)

    千次阅读 2019-05-05 21:32:33
    由于网站一般是展示PPT,想要在WEB上进行PPT展示且资源地址不在公网,一般...由于Linux平台不支持PPT直接转为图片,所以这里采用的是PPT转PDF转图片的方式。 安装使用 安装依赖 apt-getinstallunoconv apt-get...

    由于网站一般是展示PPT,想要在WEB上进行PPT展示且资源地址不在公网,一般只能通过PPT转化为图片,再由前端进行图片的展示。

    由于项目部署环境都在Linux平台,所以需要进行Linux平台上PPT转图片了解。

    由于Linux平台不支持PPT直接转为图片,所以这里采用的是PPT转PDF转图片的方式。

    安装使用

    安装依赖

    apt-get install unoconv

    apt-get install imagemagick

    使用方式

    1. 将odt文件转成pdf文件。unoconv -f pdf XXXXXX是你需要转换的文件(包括后缀)。
    2. 将pdf转成图片(jpg)。convert XXX.pdf %d.jpgXXX是pdf的文件名,%d是按页进行转换

    pdf乱码

    如果转换出来的pdf里面中文乱码,是因为linux下没有相关的字体,解决方法就是把win下的字体复制到linux下

    1. 打包字体。
      进入C:\WINDOWS\Fonts,进行打包 win.zip
    2. 上传服务器
      把win.zip 上到局域网服务器放到/home/tmp目录下
    3. 解压并设置字体

    cd /home/tmp  

    //解压  

    unzip win.zip  

    mv win /usr/share/fonts  

    cd win  

    chmod  -Rf 755 Fonts  

    //加载字体  

    mkfontscale  

    mkfontdir  

    fc-cache –fv

    Python实现

    在安装完依赖后,可利用python脚本调用指令将PPT转为PDF

    import os

    command = 'unoconv -f pdf %s' % (new_file_path)

    os.system(command)

    由于Python存在将PDF转为图片的第三方库wand,且转化的图片效果比convert命令效果更好,所以这里Python采用第三方库wand进行处理

    from wand.image import Image

    import os

    pdf_file = os.path.join(DATA_PATH, dir_path, hashed_name + '.pdf')#PPT转化后的PDF的路径地址+文件名

            image_pdf = Image(filename=pdf_file, resolution=300)

            image_jpeg = image_pdf.convert('jpg')

    # 将pdf数据流转化为jpg数据

            req_image = []

            for img in image_jpeg.sequence:

                img_page = Image(image=img)

                req_image.append(img_page.make_blob('jpg'))

            #按每页进行划分对应ppt图片

            i = 0#第几页,这里从0开始计算

     

            for img in req_image:

                img_name = '%s.jpg' % (str(i))#文件名

                img_path = os.path.join(DATA_PPT_PATH, dir_path, hashed_name, img_name)#文件地址

                with open(img_path, 'wb+') as new_file:

                    new_file.write(img)

                i += 1

                #保存对应数据文件

    注意事项

    从PPT转化为图片的过程所花费时间较长,且会比较占系统资源,如果通过WEB服务器进行接口处理PPT转化图片会进行长时间的请求,很容易造成服务器请求超时,服务器超时可以查看服务器超时处理进行了解处理。

    Window处理方案

    Linux平台上的PPT转PDF的方式并不完美,还是有机会产生错误,如果想完美的处理建议在Window平台进行处理。

    Python脚本

    由于该脚本针对window平台下的Python方案,原因是需要PC已下载微软Powerpoint,且comtypes第三库为window平台使用库。

    # -*- coding: utf-8 -*-

    """

    Created on Sun Mar 11 16:23:02 2018

     

    @author: hp

    """

     

    import comtypes.client

    import os

    def init_powerpoint():

        powerpoint = comtypes.client.CreateObject("Powerpoint.Application")

        powerpoint.Visible = 1

        return powerpoint

     

    def ppt_to_pdf(powerpoint, inputFileName, outputFileName, formatType = 32):

        if outputFileName[-3:] != 'pdf':

            outputFileName + ".pdf"

        deck = powerpoint.Presentations.Open(inputFileName)

        deck.SaveAs(outputFileName,formatType)                          # formatType = 32 for ppt to pdf

        deck.Close()

     

    def convert_files_in_folder(powerpoint, folder):

        files = os.listdir(folder)                                      #回指定文件夹包含的文件或文件夹名字的列表

        pptfiles = [f for f in files if f.endswith((".ppt",".pptx"))]   #使用循环批量转换

        for pptfile in pptfiles:

            fullpath = os.path.join(cwd,pptfile)                        #将多个路径组合后返回

            ppt_to_pdf(powerpoint, fullpath, fullpath)

     

    if __name__ == "__main__":

        powerpoint = init_powerpoint()

        cwd = os.getcwd()  # 返回当前进程的目录

        convert_files_in_folder(powerpoint, cwd)

        powerpoint.Quit()

     

    展开全文
  • 前言:刚开发出一款应用程序马上就要上线了,可喜可贺,可喜可贺扑面而来的是PC端的需求,新的需求里有好几处是将PPT上传经过处理图片(JPEG, PNG,JPG等格式)保存到服务器待用。第一时间想到的POI,开始写的...

    前言:刚开发出一款应用程序马上就要上线了,可喜可贺,可喜可贺扑面而来的是PC端的需求,新的需求里有好几处是将PPT上传经过处理转成图片(JPEG, PNG,JPG等格式)保存到服务器待用。第一时间想到的POI,开始写的演示,一小时写完(其实是抄的),之后就是优化,再之后就是换方案,最终搞定。就这么简单。

    为什么换方案呢,因为POI固然强大,但是对于转PPT为图片这一块由于需要和Graphics2D的交互所以有缺陷,而且转出来的效果无法满足要求,这个问题暂时无法解决,所以果断换方案。以下是官方说明。

     

     

    方案就是用PDFBOX将PDF转成图片然后上传服务器。

    这个跨度看上去有点大,实际上没有差别,而且转出来的效果接近完美。

    大家都知道的Word,Excel,PPT都可以存为PDF格式的文件。所以问题就解决了,那就要求用户在保存制作好的资料的时候存成PDF格式的文件就好了。

    具体的代码(里面的内容看下图):资源地址

    展开全文
  • PPT转图片/PDF-实用干货

    千次阅读 2020-12-13 21:04:13
    PPT转图片或者是PDF。也许是日常开发中一个并不常见的需求,网上的技术也五花八门,搜寻一番下自己做了个总结,作者最终使用的是openoffice的方案,当然poi的方案也很优秀 方案1:Spire.Presentation 优点: 速度...

    PPT转图片或者是PDF。也许是日常开发中一个并不常见的需求,网上的技术也五花八门,搜寻一番下自己做了个总结,作者最终使用的是openoffice的方案,当然poi的方案也很优秀

    方案1:Spire.Presentation

    优点: 速度快、精准,代码简洁、转换的图片无乱码
    缺点:不开源,超级贵、免费状态下只能转10页 (我是在web状态下发请求转换的,发现一个请求可以转10页,不知道如果多个线程或者是多次求情控制每次转10页这种方案是否可行)

    官网: https://www.e-iceblue.cn (价格很高 )
    在这里插入图片描述1. 首先引入maven依赖(这里是免费版)

    	<dependency>
            <groupId>e-iceblue</groupId>
            <artifactId>spire.presentation.free</artifactId>
            <version>2.6.1</version>
        </dependency>
    
        // ppt -> pdf 
        public static void main(String[] args) throws Exception {
            //create a Presentataion instance
            Presentation presentation = new Presentation();
            //load the sample PowerPoint file
            presentation.loadFromFile("C:/Users/Administrator/Desktop/template.pptx");
            //save to PDF file
            presentation.saveToFile("ToPDF.pdf", FileFormat.PDF);
            presentation.dispose();
        }
    	
    	// ppt -> 图片
    	public static void main(String[] args) throws Exception {
            //create a Presentation object 
            Presentation presentation = new Presentation();
            //load an example PPTX file 
            presentation.loadFromFile("C:/Users/Administrator/Desktop/template.pptx");
            //loop through the slides 
            for (int i = 0; i < presentation.getSlides().getCount(); i++) {
                //save each slide as a BufferedImage 
                BufferedImage image = presentation.getSlides().get(i).saveAsImage();
                //save BufferedImage as PNG file format 
                String fileName =  String.format("ToImage-%1$s.png", i);
                ImageIO.write(image, "PNG",new File(fileName));
            }
            presentation.dispose();
    
        }
    

    方案2:使用POI的ppt工具

    优点:开源免费
    缺点:转换后图片模糊、部分ppt样式无法转换、部分会出现ppt大小与图片大小不符的问题,另外还存在ppt文字乱码问题、使用该工具pptx的转换效果优于ppt

    1.引入maven依赖

    	<dependency>
           <groupId>org.apache.poi</groupId>
           <artifactId>poi-ooxml</artifactId>
           <version>4.1.2</version>
         </dependency>
         <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-scratchpad</artifactId>
             <version>4.1.2</version>
         </dependency>
    

    2.编写代码,2003版本的ppt(后缀是.ppt)、和2007版本的pptx(后缀是.pptx)转换方法不同

    /**
     * poi 完成ppt->图片 (可以做进度、图片是一张一张的转换的)
     *
     * @author: Ming
     * @date: 2020/12/7
     */
    @Slf4j
    public class PoiPPT2Pic {
    
        /**
         * ppt/pptx转图片
         *
         * @param pptFile    ppt文件
         * @param saveFolder 要转换的图片保存的文件夹
         * @return List集合图片在服务器的绝对路径位置
         * @throws Exception 转换异常
         */
        public static List<String> pptConver2Png(File pptFile, File saveFolder) throws Exception {
            // 获取后缀并校验
            String suffix = pptFile.getName().substring(pptFile.getName().lastIndexOf(".") + 1);
            if (!"ppt".equals(suffix) && !"pptx".equals(suffix)) {
                log.error("文件格式异常,非ppt,pptx");
                throw new RuntimeException("文件格式异常,非ppt,pptx");
            }
            // 调用指定方法
            return "ppt".equals(suffix) ? PPT2Pic.ppt2Png(pptFile, saveFolder) : PPT2Pic.pptx2Png(pptFile, saveFolder);
        }
    
    
        /**
         * ppt 转图片
         *
         * @param pptFile    ppt文件
         * @param saveFolder 要转换的图片保存的文件夹
         * @return List集合图片在服务器的绝对路径位置
         * @throws Exception 转换异常
         */
        public static List<String> ppt2Png(File pptFile, File saveFolder) throws Exception {
            log.info("=>ppt路径为:" + pptFile.getAbsolutePath());
            log.info("=>要存储的路径为:" + saveFolder.getAbsolutePath());
            if (!pptFile.exists()) {
                log.error("ppt文件不存在");
                return Collections.emptyList();
            }
            // 路径不存在则创建
            if (!saveFolder.exists()) {
                saveFolder.mkdirs();
            }
            // 指定图片保存的路径
            List<String> pngFileList = new ArrayList<String>();
            // 开始时间
            long startTime = System.currentTimeMillis();
            FileInputStream is = null;
            // 将ppt文件转换成每一帧的图片
            HSLFSlideShow ppt = null;
            try {
                ZipSecureFile.setMinInflateRatio(-1.0d);
                is = new FileInputStream(pptFile);
                ppt = new HSLFSlideShow(is);
                // 指定index
                int idx = 1;
                Dimension pageSize = ppt.getPageSize();
                // 缩放比例 3倍以下会迷糊
                double image_rate = 4.0;
                // 获取高度宽度
                int imageWidth = (int) Math.floor(image_rate * pageSize.getWidth());
                int imageHeight = (int) Math.floor(image_rate * pageSize.getHeight());
                // 循环获取图片
                log.info("=>ppt解析完毕共:" + ppt.getSlides().size() + '张');
                for (HSLFSlide slide : ppt.getSlides()) {
                    // 构造输出流和画布
                    BufferedImage img = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);
                    Graphics2D graphics = img.createGraphics();
                    graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                    graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
                    graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
                    graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
                    // 设置底色
                    graphics.setPaint(Color.white);
                    // 绘制区域与缩放比例
                    graphics.fill(new Rectangle2D.Float(0, 0, imageWidth, imageHeight));
                    graphics.scale(image_rate, image_rate);
                    //防止中文乱码 (这里可以为黑体或者宋体)---  即使制定了字体也会出现部分字体或艺术字乱码的现象
                    for (HSLFShape shape : slide.getShapes()) {
                        if (shape instanceof HSLFTextShape) {
                            HSLFTextShape hslfTextShape = (HSLFTextShape) shape;
                            for (HSLFTextParagraph hslfTextParagraph : hslfTextShape) {
                                for (HSLFTextRun hslfTextRun : hslfTextParagraph) {
                                    hslfTextRun.setFontFamily("黑体");
                                }
                            }
                        }
                    }
                    // 指定输出流
                    FileOutputStream out = null;
                    try {
                        // 绘制
                        slide.draw(graphics);
                        File pngFile = new File(saveFolder.getAbsolutePath() + String.format("/%d.png", idx++));
                        out = new FileOutputStream(pngFile);
                        // 输出图片
                        ImageIO.write(img, "png", out);
                        log.info("=>第" + (idx - 1) + "张,存储路径:" + pngFile.getAbsolutePath());
                        pngFileList.add(pngFile.getAbsolutePath());
                    } finally {
                        try {
                            if (out != null) {
                                out.flush();
                                out.close();
                            }
                            if (graphics != null) {
                                graphics.dispose();
                            }
                            if (img != null) {
                                img.flush();
                            }
                        } catch (IOException e) {
                            log.error("=>ppt转换流关闭异常", e);
                        }
                    }
                }
            } finally {
                try {
                    if (is != null) {
                        is.close();
                    }
                    if (ppt != null) {
                        ppt.close();
                    }
                } catch (Exception e) {
                    log.error("=>ppt转换流关闭异常", e);
                }
            }
            log.info("=>ppt转换完成,共用时" + ((System.currentTimeMillis() - startTime) / 1000) + "秒");
            return pngFileList;
        }
    
    
        /**
         * pptx 转换到png
         *
         * @param pptxFile   ppt文件
         * @param saveFolder 图片保存的文件按夹
         * @return List集合图片在服务器的绝对路径位置
         * @throws Exception 转换异常
         */
        public static List<String> pptx2Png(File pptxFile, File saveFolder) throws Exception {
            log.info("=>ppt路径为:" + pptxFile.getAbsolutePath());
            log.info("=>要存储的路径为:" + saveFolder.getAbsolutePath());
            if (!pptxFile.exists()) {
                log.error("pptx文件不存在");
                return Collections.emptyList();
            }
            // 路径不存在则创建
            if (!saveFolder.exists()) {
                saveFolder.mkdirs();
            }
            List<String> pngFileList = new ArrayList<>();
            long startTime = System.currentTimeMillis();
            FileInputStream is = null;
            // 将ppt文件转换成每一帧的图片
            XMLSlideShow pptx = null;
            try {
                ZipSecureFile.setMinInflateRatio(-1.0d);
                is = new FileInputStream(pptxFile);
                pptx = new XMLSlideShow(is);
                // 指定index
                int idx = 1;
                Dimension pageSize = pptx.getPageSize();
                // 缩放比例 3倍以下会迷糊
                double image_rate = 4.0;
                // 获取高度宽度
                int imageWidth = (int) Math.floor(image_rate * pageSize.getWidth());
                int imageHeight = (int) Math.floor(image_rate * pageSize.getHeight());
                log.info("=>pptx解析完毕共:" + pptx.getSlides().size() + '张');
                for (XSLFSlide xslfSlide : pptx.getSlides()) {
                    // 构造输出流和画布
                    BufferedImage img = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);
                    Graphics2D graphics = img.createGraphics();
                    graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                    graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
                    graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
                    graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
                    // 设置底色
                    graphics.setPaint(Color.white);
                    // 绘制区域与缩放比例
                    graphics.fill(new Rectangle2D.Float(0, 0, imageWidth, imageHeight));
                    graphics.scale(image_rate, image_rate);
                    //防止中文乱码 (这里可以为黑体或者宋体)---  即使制定了字体也会出现部分字体或艺术字乱码的现象
                    for (XSLFShape shape : xslfSlide.getShapes()) {
                        if (shape instanceof XSLFTextShape) {
                            XSLFTextShape xslfTextShape = (XSLFTextShape) shape;
                            for (XSLFTextParagraph xslfTextParagraph : xslfTextShape) {
                                for (XSLFTextRun xslfTextRun : xslfTextParagraph) {
                                    xslfTextRun.setFontFamily("黑体");
                                }
                            }
                        }
                    }
                    // 指定输出流
                    FileOutputStream out = null;
                    try {
                        xslfSlide.draw(graphics);
                        File pngFile = new File(saveFolder.getAbsolutePath() + String.format("/%d.png", idx++));
                        out = new FileOutputStream(pngFile);
                        // 输出图片
                        ImageIO.write(img, "png", out);
                        pngFileList.add(pngFile.getAbsolutePath());
                        log.info("=>第" + (idx - 1) + "张,存储路径:" + pngFile.getAbsolutePath());
                    } finally {
                        try {
                            if (out != null) {
                                out.flush();
                                out.close();
                            }
                            if (graphics != null) {
                                graphics.dispose();
                            }
                            if (img != null) {
                                img.flush();
                            }
                        } catch (IOException e) {
                            log.error("=>pptx转换流关闭异常", e);
                        }
                    }
                }
            } finally {
                try {
                    if (is != null) {
                        is.close();
                    }
                    if (pptx != null) {
                        pptx.close();
                    }
                } catch (Exception e) {
                    log.error("=>pptx转换流关闭异常", e);
                }
            }
            log.info("=>pptx转换完成,共用时" + ((System.currentTimeMillis() - startTime) / 1000) + "秒");
            return pngFileList;
        }
    
        public static void main(String[] args) throws Exception {
            PPT2Pic.pptConver2Png(new File("C:\\Users\\Ming\\Desktop\\烟台家宽建维协同管理系统介绍材料.pptx"),
                    new File("C:\\Users\\Ming\\Desktop\\新建文件夹\\123"));
        }
    }
    

    方案3:使用openoffice

    优点: 免费、转换准确度搞
    缺点:需要第三方软件支持、占用一定内存、转换时间较长,另外openoffice只能实现ppt转pdf,pdf转图片需要另外编写代码

    OpenOffice.org 是一套跨平台的办公室软件套件,能在 Windows、Linux、MacOS X (X11)、和 Solaris 等操作系统上执行。它与各个主要的办公室软件套件兼容。OpenOffice.org 是自由软件,任何人都可以免费下载、使用、及推广它。
    官方下载地址:http://www.openoffice.org/ (需要安装)
    在这里插入图片描述1. 引入jar包
    注意: 这里有两种方案完成转换
    1.是在程序运行前通过命令的方式启动openoffice
    2.是在程序运行中通过代码启动,转换完毕后后关闭
    二者基于的jar包不同 ,请仔细阅读maven依赖中后两个依赖的说明

    		<dependency>
                <groupId>org.openoffice</groupId>
                <artifactId>jurt</artifactId>
                <version>3.0.1</version>
            </dependency>
            <dependency>
                <groupId>org.openoffice</groupId>
                <artifactId>ridl</artifactId>
                <version>3.0.1</version>
            </dependency>
            <dependency>
                <groupId>org.openoffice</groupId>
                <artifactId>juh</artifactId>
                <version>3.0.1</version>
            </dependency>
            <dependency>
                <groupId>org.openoffice</groupId>
                <artifactId>unoil</artifactId>
                <version>3.0.1</version>
            </dependency>
            <!-- 注意:jodconverter的2.2.2版本在中央仓库不具备,需要大家下载后手动安装到本地仓库
                下载地址如下https://sourceforge.net/projects/jodconverter/files/JODConverter/
     			此外:2.2.1是不兼容docx和pptx的若需要兼容则采用2.2.2或者修改默认类配置
    			具体修改可参考:https://blog.csdn.net/zhangjunli/article/details/104941509
                若采用jodconverter-core的方式则无关这个jar,也不需要关注兼容性问题
    		-->
            <dependency>
                <groupId>com.artofsolving</groupId>
                <artifactId>jodconverter</artifactId>
                <version>2.2.1</version>
            </dependency>
            <!--  这个jar包是实现openOffice服务程序代码中启动的jar,与上边的jar包属于两种工作方式 --->
            <dependency>
                <groupId>com.github.livesense</groupId>
                <artifactId>jodconverter-core</artifactId>
                <version>1.0.5</version>
            </dependency>
    

    2.编写代码

    1>方式1:命令式启动 + 代码转换
    进入openoffice安装目录,通过cmd启动一个soffice服务,
    启动的命令是
    	soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;"
    /**
         * 将ppt转换为pdf, 这个方法其实可用于docx ppt等转换为pdf 或者html
         * @param sourceFile ppt文件
         * @param pdfFile 要输出的pdf文件路径+名字
         * @return  pdf绝对路径
         * @throws Exception 转换异常
         */
        public static String officeToPDF(File sourceFile, File pdfFile) throws Exception {
            // 获取后缀并校验
            String suffix = sourceFile.getName().substring(sourceFile.getName().lastIndexOf(".") + 1);
            if (!"ppt".equals(suffix) && !"pptx".equals(suffix)) {
                log.error("文件格式异常,非ppt,pptx");
                throw new RuntimeException("文件格式异常,非ppt,pptx");
            }
            if (!sourceFile.exists()) {
                // 找不到源文件, 则返回false
                throw new RuntimeException("ppt文件不存在");
            }
            // 如果目标路径不存在, 则新建该路径
            if (!pdfFile.getParentFile().exists()) {
                pdfFile.getParentFile().mkdirs();
            }
            // 获取openOffice服务的链接。默认为8100
            OpenOfficeConnection connection = new SocketOpenOfficeConnection("127.0.0.1", 8100);
            connection.connect();
            //用于测试openOffice连接时间
            log.info("链接成功,开始转换");
            long start = System.currentTimeMillis();
            DocumentConverter converter = new StreamOpenOfficeDocumentConverter(
                    connection);
            converter.convert(sourceFile, pdfFile);
            //测试word转PDF的转换时间
            log.info("转换结束:" + ((System.currentTimeMillis() - start) / 1000));
            connection.disconnect();
            return pdfFile.getAbsolutePath();
        }
    // ========================================================    
    2> 方式2:程序中启动关闭openOffice服务
    /**
         *  打开服务器
         * @return
         */
        public static OfficeManager startService() {
            OfficeManager officeManage = null;
            DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration();
            try {
                log.info("=>openOffice准备启动服务....");
                configuration.setOfficeHome("C:\\Program Files (x86)\\OpenOffice 4");// 设置OpenOffice.org安装目录
                configuration.setPortNumbers(8100); // 设置转换端口,默认为8100
                configuration.setTaskExecutionTimeout(1000 * 60 * 5L);// 设置任务执行超时为5分钟
                configuration.setTaskQueueTimeout(1000 * 60 * 60 * 24L);// 设置任务队列超时为24小时
                officeManage = configuration.buildOfficeManager();
                officeManage.start(); // 启动服务
                log.info("=>openOffice服务启动成功");
            } catch (Exception ce) {
                log.info("openOffice转换服务启动失败!详细信息:" + ce);
            }
            return officeManage;
        }
    
    
        // 关闭服务器
        public static void stopService(OfficeManager officeManager) {
            log.info("=>关闭office转换服务....");
            if (officeManager != null) {
                officeManager.stop();
            }
            log.info("=>关闭office转换成功!");
        }
    
        /**
         *  ppt 转pdf java程序启动方式
         * @param sourceFile
         * @param pdfFile
         * @throws FileNotFoundException
         */
        public static String convert2PDF(File sourceFile, File pdfFile) throws FileNotFoundException {
            // 获取后缀并校验
            String suffix = sourceFile.getName().substring(sourceFile.getName().lastIndexOf(".") + 1);
            if (!"ppt".equals(suffix) && !"pptx".equals(suffix)) {
                log.error("文件格式异常,非ppt,pptx");
                throw new RuntimeException("文件格式异常,非ppt,pptx");
            }
            if (!sourceFile.exists()) {
                // 找不到源文件, 则返回false
                throw new RuntimeException("ppt文件不存在");
            }
            OfficeManager officeManager = startService();
            if (officeManager ==null) {
                throw  new RuntimeException("openOffice服务启动失败");
            }
            log.info("=>进行文档转换转换:" + sourceFile.getAbsolutePath() + " --> " + pdfFile.getAbsolutePath());
            long start = System.currentTimeMillis();
            OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
            // 如果目标路径不存在, 则新建该路径
            if (!pdfFile.getParentFile().exists()) {
                pdfFile.getParentFile().mkdirs();
            }
            converter.convert(sourceFile,pdfFile);
            log.info("转换成功:" + ((System.currentTimeMillis() - start) / 1000));
            stopService(officeManager);
            return  pdfFile.getAbsolutePath();
        }
    

    测试发现jodconverter-core的方式通过wps打开的ppt无法完成转换,pptx可以转换,office打开的ppt和pptx都可以

    这里顺便说一下pdf转图片,使用pdfbox

    1. 引入依赖
    		<dependency>
                <groupId>org.apache.pdfbox</groupId>
                <artifactId>pdfbox</artifactId>
                <version>2.0.20</version>
            </dependency>
    
    1. 实现代码转换
    /**
         * dpi越大转换后越清晰,相对转换速度越慢
         */
        private static final Integer DPI = 100;
    
        /**
         * 转换后的图片类型
         */
        private static final String IMG_TYPE = "png";
       
    	/**
         * pdf转图片
         *
         * @param pdfFile pdf路径
         * @param folderPath 图片保存位置
         * @return
         * @throws IOException
         */
    	public static List<String> pdfToImage(File pdfFile, File folderPath) throws IOException {
            log.info("=>pdf转图片");
            log.info("=>pdf路径为:" + pdfFile.getAbsolutePath());
            log.info("=>要存储的图片路径为:" + folderPath.getAbsolutePath());
            long start =  System.currentTimeMillis();
            // 返回值
            List<String> result = new ArrayList<>();
            log.info("=>正在读取pdf");
            PDDocument document = PDDocument.load(new FileInputStream(pdfFile));
            PDFRenderer renderer = new PDFRenderer(document);
            FileOutputStream out = null;
            log.info("=>读取完毕开始转换,共"+document.getNumberOfPages() +"张");
            for (int i = 0; i < document.getNumberOfPages(); ++i) {
                BufferedImage bufferedImage = renderer.renderImageWithDPI(i, DPI);
                File pngFile = new File(folderPath.getAbsolutePath() + String.format("/%d.png", (i+1)));
                out = new FileOutputStream(pngFile);
                ImageIO.write(bufferedImage, IMG_TYPE, out);
                log.info("=>第"+(i+1)+"张转换完毕,"+pngFile.getAbsolutePath());
                result.add(pngFile.getAbsolutePath());
                out.close();
            }
            log.info("=>转换结束-成功," + ((System.currentTimeMillis() - start) / 1000) + "秒");
            return result;
        }
    
    展开全文
  • 上篇介绍了windows上将ppt转换为图片的方法,但是在linux平台上确并无法使用,这里再介绍一下自己开发过程中使用的linux上ppt转图片的方法! 同样的,使用POI会有之前存在的清晰度以及内存的问题,所以介绍另一种...

    上篇介绍了windows上将ppt转换为图片的方法,但是在linux平台上确并无法使用,这里再介绍一下自己开发过程中使用的linux上ppt转图片的方法!
    同样的,使用POI会有之前存在的清晰度以及内存的问题,所以介绍另一种工具——libreoffice!
    ppt等文件是office的,linux平台没有微软的office,所以我们可以使用其他的office处理软件来转化文件的格式!
    这里介绍的方法就是通过libreoffice将ppt转换为pdf,然后在使用pdfbox将pdf转换为高清图片(其实转换为pdf已经可以在前端展示了)

    1、安装libreoffice

    可以参考官方网站的安装说明,说得很清楚,看清楚系统复制命令就可以(我这里从官网搬运一下)。

    Debian/Ubuntu系统 (.deb包):
    $ cd ~/下载/ /* 切换到安装包所在的目录 *
    $ sudo dpkg -i ./LibreOffice_4.x.x_Linux_x86_deb/DEBS/*.deb  /* 安装主安装程序的所有deb包 */
    $ sudo dpkg -i ./LibreOffice_4.x.x_Linux_x86_deb_langpack_zh-CN/DEBS/*.deb  /* 安装中文语言包中的所有deb包 */
    $ sudo dpkg -i ./LibreOffice_4.x.x_Linux_x86_deb_helppack_zh-CN/DEBS/*.deb  /* 安装中文离线帮助文件中的所有deb包 */
    
    Fedora/SUSE/Mandriva系统 (.rpm包):
    $ cd ~/下载/ /* 切换到安装包所在的目录 *
    $ sudo yum install ./LibreOffice_4.x.x_Linux_x86_rpm/RPMS/*.rpm  /* 安装主安装程序的所有rpm包 */
    $ sudo yum install ./LibreOffice_4.x.x_Linux_x86_rpm_langpack_zh-CN/RPMS/*.rpm  /* 安装中文语言包中的所有rpm包 */
    $ sudo yum install ./LibreOffice_4.x.x_Linux_x86_rpm_helppack_zh-CN/RPMS/*.rpm  /* 安装中文离线帮助文件中的所有rpm包 */
    

    我安装的版本是6.4,大家可以自己选择!检验是否安装成功:

    libreoffice6.4 -help
    

    在这里插入图片描述
    出现一堆说明就证明已经安装成功了,就可以愉快地进行各种格式转换了。

    2、使用libreoffice将ppt转化为pdf
    # filePath 是要进行转换的ppt文件路径
    # outputPath 是转换完成后PDF文件输出的目录路径
    libreoffice6.4 --convert-to pdf:writer_pdf_Export  filePath --outdir   outputPath
    

    在转换的时候如果使用xshell监控服务器,那么会出现弹窗:Xmanager软件来处理X11转发需求…

    在这里插入图片描述
    这个烦人的弹窗如果我们不点,那么转换就不会开始。我们可以使用两种方法解决这个问题:

    • 第一就是根据提示安装一个xmanage,弹窗自然会消失
    • 第二种方法就是修改xshell的设置,不转发这种请求
      在这里插入图片描述
    3、使用pdfbox将转换好的pdf转换为图片

    依赖:

    <!--pdf 转图片支持-->
    		<dependency>
    			<groupId>org.apache.pdfbox</groupId>
    			<artifactId>pdfbox</artifactId>
    			<version>2.0.1</version>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.pdfbox</groupId>
    			<artifactId>fontbox</artifactId>
    			<version>2.0.0</version>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.pdfbox</groupId>
    			<artifactId>jempbox</artifactId>
    			<version>1.8.11</version>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.pdfbox</groupId>
    			<artifactId>xmpbox</artifactId>
    			<version>2.0.0</version>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.pdfbox</groupId>
    			<artifactId>preflight</artifactId>
    			<version>2.0.0</version>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.pdfbox</groupId>
    			<artifactId>pdfbox-tools</artifactId>
    			<version>2.0.0</version>
    		</dependency>
    		<dependency>
    			<groupId>com.itextpdf</groupId>
    			<artifactId>itextpdf</artifactId>
    			<version>5.5.13.1</version>
    		</dependency>
    
    

    工具类:

    public class PptToImg {
        public static Integer pdfBoxConvert(String filePath,String outputPath) throws IOException {
            File outputDir = new File(outputPath);
            if (!outputDir.exists())
                outputDir.mkdirs();
            String type="png";
            //Loading an existing PDF document
            File file = new File(filePath);
            PDDocument doc = PDDocument.load(file);
            //Instantiating the PDFRenderer class
            PDFRenderer renderer = new PDFRenderer(doc);
            //Rendering an image from the PDF document
            //BufferedImage image = renderer.renderImage(0);
            //Writing the image to a file
            int pageCount = doc.getNumberOfPages();
            for (int i = 0; i < pageCount; i++) {
                BufferedImage tempImage = renderer.renderImageWithDPI(i, 144); // Windows native DPI
                // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
                //ImageIO.write(tempImage, type, new File(outputPath+"\\"+(i+1)+"."+type));
                ImageIO.write(tempImage, type, new File(outputPath+"/"+(i+1)+"."+type));
            }
            //ImageIO.write(image, "JPEG", new File(outputPath));
            System.out.println("Image created");
            //Closing the document
            doc.close();
            return pageCount;
        }
    }
    

    直接调用工具类中的方法,然后传入对应的文件路径和输出路径就可以了。图片的效果也是很好的!
    在这里插入图片描述
    另外这个libreoffice可以将excle、word等各种类型也转换成pdf,所以有在网页预览的功能需求就可以使用这个工具转换成pdf,然后在前端展示!

    展开全文
  • C# PPT转图片的解决方案

    千次阅读 2017-10-19 10:01:42
    1、PPT转图片代码 using Microsoft.Office.Core;using Microsoft.Office.Interop.PowerPoint; public bool ConvertPics(string sourcePath, string targetPath, PpSaveAsFileType targetFileType) {
  • ppt转换图片方法 ,采用Jacob调用本地COM组件转换,其中作为服务器供用户上传时,如果用户传ppt是有密码的则会使ppt一直停留在输入密码状态,导致其它用户无法使用,这时可以简单做个超时判断,关闭当前转换,具体...
  •   由于业务需求需要实现文档图片输出,PHP实现效率不是很高(liboffice,ImageMagick,unoconv,wkhtmltopdf等),尝试用python做个小尝试,目前只能实现ppt与pdf图片输出,按照以下步骤操作,理论上都可以...
  • 图片服务器的url hash架构 剖析 ;什么是url hash架构;为什么要用url hash架构;各种url hash架构;基于dns的hash架构图;基于dns的hash架构说明;基于dns的hash架构优缺点;基于nginx的自动hash架构图;基于nginx的自动...
  • 最简单通用的方法就是使用POI来转换,但是转换的图片清晰度很低,即使调高了倍数还是和原图有差距,而且随着设置图片倍数的提高内存占用也变得十分巨大,在IDEA中甚至会出现OOM的情况。下面贴一下使用POI转换的代码...
  • centos/linux php word/ppt转图片 自己可能从没想过会写什么总结,但是就是没办法,网上没有统一的完整的解决方法,自己好不容易搞出来了,那么就分享给大家把,坑太多,你们一定要认真看,步骤很详细,有时候吧搞...
  • poi与aspose的比较 ...ppt/pptxpng图片阶段:poi或者aspose,其中poi在这个阶段的速度比aspose快很多,但是有一点,就是偶尔会底层报错,但是aspose出错的可能性极低。具体怎末选,看你是看重速度还是上传的成功率
  • poi的实现方式是分步实现的,并不能直接将ppt,pptx转为pdf. 首先是maven依赖 1.pom.xm需要引入的依赖 <!--poi依赖--> <dependency> <groupId>org.apache.poi</groupId> <...
  • 搜了一阵,看似好用的微软 Office Web Viewer 却有着速度极慢、限制10M大小等麻烦,前端直接使用 pdf.js 也遇到了跨域之类的问题,索性一不做二不休,把 PPT 和 PDF 都转换成图片,再分页传回给前端。 去网上搜...
  • spring+poi PPT转图片 生产环境解决方案 import org.apache.commons.lang3.StringUtils; import org.apache.poi.hslf.usermodel.*; import org.apache.poi.xslf.usermodel.*; import org.slf4j.Logger; import org....
  • 背景:最近项目需要实现PPT预览功能,以及项目APP上浏览ppt,初步方案是ppt转为图片。 实现 1、ppt转为pdf,然后pdf转为图片 该种实现,先将ppt转为pdf文件,实现方式有很多,可参考之前文章 文档在线预览,将...
  • 通过Email推送统计报告。...本文推荐一种方式:将PPT图表内容转换为高保真的图片,将图片放到Email中发送,在不丢失用户体验的前提下,工作量尽可能小。 一、 将PPT报告转换为PNG图片文件。 有两种方式:一种是采用
  • PHP 调用com组件将ppt转为图片。 需要在php.ini中开启 extension=php_com_dotnet.dllcom.allow_dcom=true 测试代码如下: <?php $powerpnt = new COM("powerpoint.application") or die("Unable ...
  • 安装openoffice4 (用于把文档(ppt)成pdf)根据系统的位数安装 使用jodconverter-core3.0-beta-4(要上传maven本地仓库) 安装ImageMagick:yum install ImageMagick(用于pdf转图片) 安装pdftotext 用于提取...
  • 最近公司有个需求,将PPT课件图片列表,然后在前端展示成轮播图,于是一开始通过Microsoft.Office.Interop.PowerPoint包实现了这个需求具体代码如下: + View Code    由于我们图片都是云存储,所以存到...
  • 后台把ppt上传到服务器上,前台点击是ppt路径为下载,现在想实现点击转换成图片观看的
  • 迅捷在线ppt转换成pdf转换器提供了一个可以将ppt文档直接转换成pdf的选项,我们只要将文档上传到服务器上,然后单击一下“生成文档;按钮,就可以快速将ppt文件转换成pdf。  百度访问ppt在线pdf转换,进入平台后...
  • 百度,阿里,腾讯除了在搜索,电商,社交领域有自己的明星产品,他们还研发了很多实用的小工具。其实,微软作为全球知名的互联网企业,除了OFFICE软件之外,它也有很多实用的小工具...除了PPT模板之外,我们还可以看...
  • word在线预览api接口 office在线预览接口 word转图片 ppt在线预览 excel在线预览 预览支持的文件格式:word(doc,docx),excel(xls,xlsx),pptppt,pptx),pdf 生成预览原理:文件图片 支持移动端浏览,...
  • 对于PPT如果设置了禁止浏览,写保护,禁止复制,禁止另存为,我们可以用winrar工具来解除这些限制。具体方法是:1、首先,把你想要解除的PPT文件进行重命名先,把后面的扩展名改成".zip"的形式;(注意:如果没有显示...
  • 如果你的手头资料不多时,可以使用在线pdf转换实现ppt转pdf,生成的文本效果一点也不失真。  迅捷在线ppt转换成pdf转换器是一个非常实用的在线版pdf编辑工具,可以把pdf文件(包括其中的文本和图片)转化为可编
  • 最近有个在线查看PPT的需求,找了一圈也没一个很好的方案在前段查看,就想着把PPT转成PDF传到OSS上让前段查看 @ApiOperation(value = "上传单张图片", notes = "fileType 1:art 2:temp ") @RequestMapping(value =...
  • 整理工作文件时常常需要将... 我们这里使用的是全新迅捷在线ppt转换成pdf转换器,想office转pdf、图片转pdf等功能都有。首先需要你去百度访问该平台。这个方法很简单,大家仅需输入关键词“在线pdf转换器、pdf在线转
  • 1.在安装时显示无法连接到服务器或类似的网络出错信息1. 在安装时显示“无法连接到服务器”或类似的网络出错信息? DynEd课件在安装和使用时需要访问以下两个站点,请在安装前检查你的计算机是否能够正确连接到这两...
  • 主要为大家详细介绍了java实现PPT转PDF出现中文乱码问题的解决方法,进行了详细的问题分析,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,734
精华内容 5,493
关键字:

ppt服务器转图片