【问题标题】:Apache poi slide show to pdf conversionApache poi 幻灯片到 pdf 的转换
【发布时间】:2011-11-28 04:52:16
【问题描述】:

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

             OR

有什么方法可以用JAVA把PPT文件转换成PDF文件?

【问题讨论】:

    标签: java pdf powerpoint apache-poi


    【解决方案1】:

    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 Slide -> 从中获取 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();
    
        }
    }
    

    【讨论】:

    • 你使用的是哪个版本的 poi
    【解决方案2】:

    一种选择是使用 POI 转换each slide into an image,然后使用Apache PDFBox 之类的东西将每个图像放到它自己的 PDF 页面上。这应该适用于更简单的 PPT 文件,但渲染幻灯片的代码仍然是 WIP。所以,如果你有一张非常复杂的幻灯片,你可能会发现一些缺失/不正确的部分,如果你修复了这些差距,请发送补丁!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多