2011-09-30 120 views

回答

4

一種選擇是使用POI轉換each slide into an image,然後使用類似Apache PDFBox的東西將每個圖像放到它自己的PDF頁面上。這對於更簡單的PPT文件應該很好,但呈現幻燈片的代碼仍然是WIP。所以,如果你有一個非常複雜的幻燈片,你可能會發現一些缺失/不正確的東西,如果你修復了這些缺口,就會發送補丁!

否則,你的另一種選擇是使用Java綁定OpenOffice和有你

5

Gagravarr做轉換,感謝你用下面的方法您的評論:PPT - >圖像 - > PDF。它爲我提供了進一步解決方案的線索。

最近,我面臨着相同的任務:使用Java工具將PPT報告轉換爲PDF報告。 PPT報告是通過Apache POI庫生成的,我打算重新使用現成的PPT結構。

我開發了兩種解決方案,每種都有自己的優點/缺點。他們兩人都使用2.1.7版本的iText庫(這是免費使用的,而且很棒))。他們都支持日語符號後,額外的增強。

的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(); 

    } 
}