2012-12-16 2 views
2

PPT 파일의 슬라이드를 png로 변환하는 작은 도구를 쓰고 있는데 문제는 숨겨진 슬라이드 때문입니다. Java에서 슬라이드를 표시하도록 변경하려면 어떻게해야합니까? 현재 PNG 로의 변환을 위해 Apache POI를 사용하고 있습니다. 클립 아트에서는 작동하지 않지만 unconv를 사용하여 PDF로 내보내기를 시도한 다음이를 minipulating하는 것으로 유혹됩니다. 그러나 이렇게하면 모든 숨겨진 슬라이드를 고려하지 않습니다. 그렇다면 어떻게 숨겨진 슬라이드를 프로그램 적으로 변경할 수 있습니까?프로그래밍 방식으로 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로만 테스트되었습니다.

18 는 대응하는 슬라이드 숨김 및 슬라이드 쇼 동안 표시되어 있는지의 여부를 지정하는 바이트 spec ([MS-PPT] .PDF/버전 3.0/201 페이지)를 말한다, 즉 비트 3 (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

[patch # 55560] (https://issues.apache.org/bugzilla/show_bug.cgi?id=55560)을 제출했습니다. 그것이 통합되면 볼 수 있습니다 ... – kiwiwings

관련 문제