2012-12-16 26 views
2

即時通訊編寫一個將PPT文件中的幻燈片轉換爲PNG的小工具,我遇到的問題是隱藏幻燈片。如何將幻燈片更改爲在Java中可見?我目前使用Apache POI轉換爲PNG,雖然這不適用於剪貼畫,所以我很想用unoconv先將它導出爲PDF,然後將其縮小。但是像這樣做並沒有考慮到所有隱藏的幻燈片。那麼我怎樣才能以編程方式將隱藏的幻燈片更改爲可見?以編程方式取消隱藏PPT文件中的幻燈片

+0

每張幻燈片都有一個.SlideShowTransition.Hidden屬性(布爾值),用於判斷它是否隱藏。 –

+0

@SteveRindsberg這種方法在哪裏? – Dean

+0

它是PowerPoint對象模型的一部分。不管POI和Java是否允許你訪問,我都不知道。如果您有權訪問PPTX文件中的XML,則slidenn.xml文件將以類似於以下內容的格式開始: if幻燈片隱藏。未隱藏的幻燈片不會有show =「0」部分。 –

回答

2

這是一種黑客攻擊,並且已經使用POI 3.9/POI-Scratchpad 3.8的Libre Office的PPT進行過測試。

spec([MS-PPT] .PDF/3.0版本/ 201頁)指出,該位3字節18 指定相應滑動是否是隱藏的,在幻燈片放映期間不顯示的(fHidden)

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.lang.reflect.Field; 

import org.apache.poi.hslf.model.Slide; 
import org.apache.poi.hslf.record.Record; 
import org.apache.poi.hslf.record.RecordTypes; 
import org.apache.poi.hslf.record.UnknownRecordPlaceholder; 
import org.apache.poi.hslf.usermodel.SlideShow; 

public class UnhidePpt { 
    public static void main(String[] args) throws Exception { 
     FileInputStream fis = new FileInputStream("hiddenslide.ppt"); 
     SlideShow ppt = new SlideShow(fis); 
     fis.close(); 

     Field f = UnknownRecordPlaceholder.class.getDeclaredField("_contents"); 
     f.setAccessible(true); 


     for (Slide slide : ppt.getSlides()) { 
      for (Record record : slide.getSlideRecord().getChildRecords()) { 
       if (record instanceof UnknownRecordPlaceholder 
        && record.getRecordType() == RecordTypes.SSSlideInfoAtom.typeID) { 
        UnknownRecordPlaceholder urp = (UnknownRecordPlaceholder)record; 

        byte contents[] = (byte[])f.get(urp); 
        contents[18] &= (255-4); 
        f.set(urp, contents); 
       } 
      } 
     } 

     FileOutputStream fos = new FileOutputStream("unhidden.ppt"); 
     ppt.write(fos); 
     fos.close(); 
    } 
} 
+0

我已經提交了一個[補丁#55560](https://issues.apache.org/bugzilla/show_bug.cgi?id=55560)。讓我們看看它何時被整合... – kiwiwings

相關問題