实现思路
将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();
}