Apache poi幻灯片放映到pdf转换

时间:2011-09-30 05:09:27

标签: java pdf powerpoint apache-poi

有没有办法使用apache poi将生成的。 ppt 文件转换为。 pdf 文件?

             OR

如何使用JAVA将 PPT 文件转换为 PDF 文件?

2 个答案:

答案 0 :(得分:6)

Gagravarr,感谢您对以下方法的评论:PPT - >图像 - > PDF。它为我提供了进一步解决方案的线索。

最近,我遇到了同样的任务:使用Java工具将PPT报告转换为PDF报告。 PPT报告是通过Apache POI lib生成的,我打算重用现成的PPT结构。

我开发了两种解决方案,每种解决方案都有自己的优点/缺点。并且它们都使用版本为2.1.7的iText库(可以免费使用,这很棒))。在进一步增强后,它们都支持日文符号。

  

1。 Apache POI幻灯片 - >图像 - > PDF

演示代码示例:

package com.test.pdf;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hslf.model.Slide;
import org.apache.poi.hslf.usermodel.SlideShow;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Image;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfWriter;

public class PPTtoImageToPDFexample {


    public static void main(String[] args) throws IOException, DocumentException {

        //load any ppt file
        FileInputStream inputStream = new FileInputStream("d:/temp/initialPPT.ppt");
        SlideShow ppt = new SlideShow(inputStream);
        inputStream.close();
        Dimension pgsize = ppt.getPageSize();

        //take first slide and save it as an image
        Slide slide = ppt.getSlides()[0];
        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.draw(graphics);
        FileOutputStream out = new FileOutputStream("d:/temp/slideImage.png");
        javax.imageio.ImageIO.write(img, "png", out);
        out.close();


        //get saved slide-image and save it into pdf
        Image slideImage = Image.getInstance("d:/temp/slideImage.png");
        Document document = new Document();
        PdfWriter.getInstance(document, new FileOutputStream("d:/temp/PPTtoImageTest.pdf"));
        document.setPageSize(new Rectangle(slideImage.getWidth(), slideImage.getHeight()));
        document.open();
        slideImage.setAbsolutePosition(0, 0);
        document.add(slideImage);
        document.close();

    }
}
  

2. 此方法即时运行:采用Apache POI幻灯片 - >从它获取awt.Graphics2实例 - >将此界面传递给iText   画引擎。

演示代码示例:

package com.test.pdf;

import java.awt.Dimension;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hslf.model.Slide;
import org.apache.poi.hslf.usermodel.SlideShow;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfGraphics2D;
import com.lowagie.text.pdf.PdfWriter;

public class PPTtoPDFdirectly {



    public static void main(String[] args) throws IOException, DocumentException {

        //load any ppt file
        FileInputStream inputStream = new FileInputStream("d:/temp/initialPPT.ppt");
        SlideShow ppt = new SlideShow(inputStream);
        inputStream.close();
        Dimension pgsize = ppt.getPageSize();


        //take first slide and draw it directly into PDF via awt.Graphics2D interface.
        Slide slide = ppt.getSlides()[0];

        Document document = new Document();
        PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("d:/temp/PPTtoPDF.pdf"));
        document.setPageSize(new Rectangle((float)pgsize.getWidth(), (float) pgsize.getHeight()));
        document.open();

        PdfGraphics2D graphics = (PdfGraphics2D) pdfWriter.getDirectContent().createGraphics((float)pgsize.getWidth(), (float)pgsize.getHeight());
        slide.draw(graphics);
        graphics.dispose();

        document.close();

    }
}

答案 1 :(得分:4)

一种选择是使用POI转换each slide into an image,然后使用类似Apache PDFBox的内容将每个图片放置在自己的PDF页面上。这应该适用于更简单的PPT文件,但渲染幻灯片的代码仍然是WIP。所以,如果你有一个非常复杂的幻灯片,你可能会发现一些位丢失/不正确,如果你修复了这些空白,请发送补丁!

否则,您的另一个选择是使用OpenOffice的Java绑定,并让它为您进行转换