PDF box 结合POI 将pdf转为PPT

本文介绍了一种将PDF文件转换为PPT演示文稿的方法。该工具通过将PDF页面渲染为图片,然后将这些图片逐页插入到PPT中来完成转换过程。此方法保留了原始PDF的内容布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现思路

将PDF转为图片,将图片插入每一页PPT上,保持原尺寸和比例。

代码实现

引入的类

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfDocument;
import lombok.extern.java.Log;
import org.apache.pdfbox.io.IOUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageTree;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFPictureData;
import org.apache.poi.xslf.usermodel.XSLFPictureShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;
public static void convertPDF2PPT(String pdfSource, String pptDest) throws IOException {
        XMLSlideShow ppt = new XMLSlideShow();
        File source = new File(pdfSource);
        JAssert.pass(source.exists(), "报告不存在");
        FileInputStream fis = new FileInputStream(source);
        PDDocument document = PDDocument.load(source);
        PDPageTree list = document.getPages();
        File outputDir = new File(pptDest);
        if (!outputDir.exists()){
            outputDir.mkdirs();
        }

        String fileName = source.getName().replace(".pdf","");
        PDFRenderer pdfRenderer = new PDFRenderer(document);
        List<File> tmpFiles = new ArrayList<>();
        for (int i = 0; i < list.getCount(); i++) {
            PDPage page = list.get(i);
            BufferedImage image = pdfRenderer.renderImageWithDPI(i, 300, ImageType.RGB);

            File tmpImagFile;
            if (outputDir.isDirectory()){
                 tmpImagFile = new File(pptDest + fileName + "_" + (i + 1) + ".png");
            } else {
                String dir = outputDir.getParent();
                tmpImagFile = new File(dir+ File.separator + fileName + "_" + (i + 1) + ".png");
            }
            tmpFiles.add(tmpImagFile);
            int width = (int) page.getBBox().getWidth();
            int height = (int) page.getBBox().getHeight();
            ImageIO.write(image,"png",tmpImagFile);
            ppt.setPageSize(new Dimension(width,height));
            XSLFSlide slide = ppt.createSlide();
            byte[] pictureData = IOUtils.toByteArray(new FileInputStream(tmpImagFile.getAbsoluteFile()));
            XSLFPictureData pd = ppt.addPicture(pictureData, PictureData.PictureType.PNG);
            XSLFPictureShape pic = slide.createPicture(pd);
            pic.setAnchor(new Rectangle(0,0,width,height));
        }
        document.close();
        //清理临时生成的图片
        tmpFiles.forEach(File::delete);
        String pptDestName;
        if (pptDest.contains(".pptx")){
            pptDestName = pptDest;
        } else {
            pptDestName = pptDest+ File.separator + fileName +".pptx";
        }
        FileOutputStream out = new FileOutputStream(pptDestName);
        ppt.write(out);
        out.close();
        ppt.close();
    }