这篇文章主要为大家详细介绍了java实现PPT转化为PDF的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


PPT文件
在这里插入图片描述
将 PPT文件转为 PDF文件后
在这里插入图片描述

①、添加POM依赖:

        <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.1.3</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.8</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.8</version>
        </dependency>

②、将 PPT文件 转为 PDF文件案例代码:

package com.jeewechat.wechat.pdf;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfWriter;
import lombok.extern.log4j.Log4j;
import org.apache.poi.hslf.model.TextRun;
import org.apache.poi.hslf.usermodel.RichTextRun;
import org.apache.poi.hslf.usermodel.SlideShow;
import org.apache.poi.hslf.model.Slide;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;

/**
 * @ClassName: PPTUtil
 * @Description TODO 将 PPT文件 转为 PDF文件
 * @Author: WangTianLiang
 * @Create: 2021/5/12
 **/
@Log4j
public class PPTUtil {

    /**
     * 测试用例
     */
    public static void main(String[] args) {
        // 读入PPT文件
        File file = new File("E:/PPT/Java问题定位培训.ppt");
        boolean b = doPPTtoImage (file);
        System.out.println (b);

    }




    /**
    * @description TODO 将PPT生成PDF
    * @param file PPT文件对象
    * @return boolean
    * @author WangTianLiang
    * @date 2021/5/12
    */
    public static boolean doPPTtoImage(File file) {
        // step 1: 文件格式校验
        boolean isppt = checkFile(file);
        if (!isppt) {
            log.info("文件格式错误!");
            return false;
        }
        //获取文件名称 如 Java问题定位培训.ppt
        String oldFileName = file.getName();
        // step 2: 文件名称截取获取 Java问题定位培训
        String fileName = oldFileName.substring(0, oldFileName.indexOf("."));
        try {
            //step 3: 创建文件字节输入流对象 加载PPT
            FileInputStream is = new FileInputStream(file);
            SlideShow ppt = new SlideShow(is); //加载PPT
            is.close();
            Dimension pgsize = ppt.getPageSize();
            Slide[] slide = ppt.getSlides(); //ppt页数
            int slideLength = slide.length;
            if (slideLength <= 0){
                return false;
            }
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            // step 4: 创建目录用于存储生产后的PDF文件
            String pptFilePathUrl = "E:\\PPT\\";
            // step 5: 创建目录用于存储PPT转为jpeg 后的图片文件
            String imageFilePathUrl = "E:\\PPT\\"+ uuid +"\\";
            File f=new File(imageFilePathUrl);
            if(!f.isDirectory()) {  //判断是否有D://ExamPaperDerived/此文件夹
                f.mkdirs();         //没有则新建再保存
            }
            // step 6: 循环读取图片数据
            for (int i = 0; i < slide.length; i++) {
                log.info("第" + i + "页。");
                if (slide[i].getNotesSheet() != null&& slide[i].getNotesSheet().getTextRuns() != null) {
                    // 获取第一个备注
                    log.info("备注:"+ slide[i].getNotesSheet().getTextRuns()[0].getText());
                }
                TextRun[] truns = slide[i].getTextRuns();
                for (int k = 0; k < truns.length; k++) {
                    RichTextRun[] rtruns = truns[k].getRichTextRuns();
                    for (int l = 0; l < rtruns.length; l++) {
                        rtruns[l].setFontIndex(1);
                        rtruns[l].setFontName("宋体");
                        // 获取文本列表
                        log.info(rtruns[l].getText());
                    }
                }
                BufferedImage img = new BufferedImage(pgsize.width,pgsize.height, BufferedImage.TYPE_INT_RGB);
                Graphics2D graphics = img.createGraphics();
                graphics.setPaint(Color.white);
                graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width,pgsize.height));
                slide[i].draw(graphics);

                // step 7: 输出文件 设置图片的存放路径和图片的格式(jpeg,png,bmp等等),注意生成文件路径
                FileOutputStream out = new FileOutputStream(imageFilePathUrl+ "pict_"+(i + 1) + ".jpeg");
                ImageIO.write(img, "jpeg", out);
                out.close();
            }
            // step 8: 将图片生产PPT
            Boolean res = ImagetoPDF (imageFilePathUrl, pptFilePathUrl,fileName, ".pdf", slideLength);
            if (res){
                return true;
            }
            return false;
        } catch (FileNotFoundException e) {
            log.error(e.getMessage());
        } catch (IOException e) {
            log.error(e.getMessage());
        }
        return false;
    }



    /**
    * @description TODO 检查文件是否为PPT
    * @param file 文件对象
    * @return boolean
    * @author WangTianLiang
    * @date 2021/5/12
    */
    public static boolean checkFile(File file) {
        boolean isppt = false;
        //获取文件名称
        String filename = file.getName();
        String suffixname = null;
        if (filename != null && filename.indexOf(".") != -1) {
            //字符串截取获取文件后缀
            suffixname = filename.substring(filename.indexOf("."));
            if (suffixname.equals(".ppt")) {
                isppt = true;
            }
            return isppt;
        } else {
            return isppt;
        }
    }


    /**
    * @description TODO 将图片生产PPT
    * @param imageFilePathUrl 图片存储路径
    * @param pptFilePathUrl PPT存储路径
    * @param fileName PPT文件名称
    * @param Type 文件后缀
    * @param slideLength ppt页数
    * @return java.lang.Boolean
    * @author WangTianLiang
    * @date 2021/5/12
    */
    public static Boolean ImagetoPDF(String imageFilePathUrl,String pptFilePathUrl,String fileName, String Type,int slideLength) {
        // step 1: 创建文档对象
        Document document = new Document();
        try {

            // step 2: 我们创建一个writer来监听文档并将pdf流定向到文件
            PdfWriter.getInstance(document, new FileOutputStream(pptFilePathUrl+fileName+Type));
            // step 3: 打开文档
            document.open();

            for(int i=1;i<=slideLength;i++) {
                // step 4: 将图片添加到PPT文件中作为内容
                Image jpg = Image.getInstance(imageFilePathUrl+"pict_"+i+".jpeg");
                jpg.scalePercent(70);
                document.add(jpg);
            }
            // step 5: 关闭文档
            document.close();
            //创建文件流
            File temp = new File(imageFilePathUrl);
            // step 6: 判断文件是否存储
            if (temp.exists()) {
                // step 7: 递归删除文件信息
                Boolean res = deleteDir (temp);
                return res;
            }
        }
        catch(DocumentException de) {
            log.error(de.getMessage());
        }
        catch(IOException ioe) {
            log.error(ioe.getMessage());
        }
        return false;
    }

    /**
    * @description TODO 递归删除目录下的所有文件及子目录下所有文件
    * @param dir 将要删除的文件目录
    * @return boolean boolean 删除失败
    * @author WangTianLiang
    * @date 2021/5/12
    */
    public static boolean deleteDir(File dir) {
        if (dir.isDirectory()) {
            String[] children = dir.list();
            //递归删除目录中的子目录下
            for (int i = 0; i < children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        // 目录此时为空,可以删除
        return dir.delete();
    }


}

希望可以帮助到您…

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐