2012-12-18 31 views
1

我想知道,如果有什麼辦法通過Apache POI替換PPT PRESENTAIONS圖像?如何更換PPT呈現的圖像與Apache POI

我有一個模板,在那裏我已經放在元素(文本字段和圖像),我發現瞭如何替換文本,但沒有發現任何圖像。

+0

什麼是Java標記? –

+0

你是什麼意思? –

+0

在你的問題中你已經標記了'Java'。爲什麼?這是MS OFFICE相關問題 –

回答

2

替換圖像可以通過兩種方式來完成:

只需更換圖像內PPTX-文件,它是一個壓縮文件,所述路徑(/ PPT /介質)之下。檢出這post如何做到這一點..

或POI方法是刪除文件,並添加一個新的......也許更改一些其他圖像屬性(寬度,高度...) - 見下面的示例

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.OutputStream; 

import javax.xml.namespace.QName; 

import org.apache.poi.openxml4j.opc.PackagePart; 
import org.apache.poi.openxml4j.opc.PackagePartName; 
import org.apache.poi.openxml4j.opc.PackageRelationship; 
import org.apache.poi.openxml4j.opc.PackagingURIHelper; 
import org.apache.poi.openxml4j.opc.TargetMode; 
import org.apache.poi.xslf.usermodel.XMLSlideShow; 
import org.apache.poi.xslf.usermodel.XSLFSheet; 
import org.apache.xmlbeans.XmlCursor; 

public class ReplaceImageInPptx { 
    public static void main(String[] args) throws Exception { 
     FileInputStream fis = new FileInputStream("test2.pptx"); 
     XMLSlideShow pptx = new XMLSlideShow(fis); 
     fis.close(); 

     String blipNS[] = { 
      "http://schemas.openxmlformats.org/drawingml/2006/main", 
      "http://schemas.openxmlformats.org/presentationml/2006/main" 
     }; 

     for (XSLFSheet slide : pptx.getSlides()) { 
      PackagePart packPart = slide.getPackagePart(); 

      for (String ns : blipNS) { 
       XmlCursor picCur = slide.getXmlObject().newCursor(); 
       picCur.selectPath("declare namespace p='"+ns+"' .//p:blip"); // or blipFill 

       while (picCur.toNextSelection()) { 

        // ... doesn't work for all namespaces ... 
        // CTBlipFillProperties blipFill = (CTBlipFillProperties)picCur.getObject(); 
        // CTBlip blip = blipFill.getBlip(); 
        // String relId = blip.getEmbed(); 
        QName relName = new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "embed"); 
        String relId = picCur.getAttributeText(relName); 

        // remove old media file and reference 
        PackageRelationship packRel = packPart.getRelationship(relId); 
        PackagePartName oldPartName = PackagingURIHelper.createPartName(packRel.getTargetURI()); 
        packPart.getPackage().removePart(oldPartName); 

        // add something new 
        PackagePartName partName = PackagingURIHelper.createPartName("/ppt/media/smiley.jpg"); 
        PackagePart part = pptx.getPackage().createPart(partName, "image/jpeg"); 
        OutputStream partOs = part.getOutputStream(); 
        FileInputStream fis2 = new FileInputStream("src/test/resources/smiley.jpg"); 
        byte buf[] = new byte[1024]; 
        for (int readBytes; (readBytes = fis2.read(buf)) != -1; partOs.write(buf, 0, readBytes)); 
        fis2.close(); 
        partOs.close(); 

        PackageRelationship prs = slide.getPackagePart().addRelationship(partName, TargetMode.INTERNAL, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"); 
        // blip.setEmbed(prs.getId()); 
        picCur.setAttributeText(relName, prs.getId()); 

        // maybe change the size a bit 
        // blipFill.getStretch().getFillRect().setL(<left padding in % (+/-)>) 
       } 

       picCur.dispose(); 
      } 
     } 

     FileOutputStream fos = new FileOutputStream("test3.pptx"); 
     pptx.write(fos); 
     fos.close(); 
    } 
}