2017-08-12 113 views
0

有一个名为AnimationInfo的类应该从演示中提供动画信息。但我运气不好,我无法得到它。如何从Apache POI演示获取动画信息演示

List<XSLFShape> shapes = slide.getShapes(); 
for (XSLFShape shape: shapes) { 
    //Need to get animation of this shape here 
} 

任何人都可以帮助我吗?谢谢。我使用3.17版本的POI。

+1

AnimationInfo来自HSLF,而不是XSLF - 您可以通过* .getXmlObject()访问转换信息。你想收集哪些信息?查看[更早的示例](https://stackoverflow.com/questions/15197300/apache-poi-xslf-adding-movie-to-the-slide/16322340#16322340)来设置时间信息。 – kiwiwings

+0

@kiwiwings哪个对象在HSLF中有getXmlObject()方法?我也试过HSLF,我知道它只支持PPT扩展,而XSLF支持PPTX扩展。我只想检测演示文稿中是否应用了任何动画,或者不在bot .ppt和.pptx文件中。你能帮我解决吗? –

+0

只有XSLF是基于XML的,因此只有XSLF具有getXmlObject()方法。我会尝试将一些动画检测代码放在一起...基本上我会在HSLF中使用AnimationInfo并在XSLF中查找时间信息... – kiwiwings

回答

2

鉴于加入的仅检测动画,片材能够被检查溶液中加入的动画,其很可能识别的动画的存在的定时的信息,即,你可以得到一个假阳性的情况下,然后再除去。此外,您需要检查所有幻灯片,直到找到动画。

import java.io.FileInputStream; 

import org.apache.poi.hslf.record.Record; 
import org.apache.poi.hslf.record.RecordContainer; 
import org.apache.poi.hslf.record.RecordTypes; 
import org.apache.poi.hslf.usermodel.HSLFSlide; 
import org.apache.poi.sl.usermodel.Slide; 
import org.apache.poi.sl.usermodel.SlideShow; 
import org.apache.poi.sl.usermodel.SlideShowFactory; 
import org.apache.poi.xslf.usermodel.XSLFSlide; 

public class AnimCheck { 
    private static final int timingRecordPath[] = { 
     RecordTypes.ProgTags.typeID, 
     RecordTypes.ProgBinaryTag.typeID, 
     RecordTypes.BinaryTagData.typeID, 
     0xf144 
    }; 


    public static void main(String[] args) throws Exception { 
     SlideShow<?,?> ppt = SlideShowFactory.create(new FileInputStream("no_anim.pptx")); 
     Slide<?,?> slide = ppt.getSlides().get(0); 
     boolean hasTiming; 
     if (slide instanceof XSLFSlide) { 
      XSLFSlide xsld = (XSLFSlide)slide; 
      hasTiming = xsld.getXmlObject().isSetTiming(); 
     } else { 
      HSLFSlide hsld = (HSLFSlide)slide; 
      Record lastRecord = hsld.getSheetContainer(); 
      boolean found = true; 
      for (int ri : timingRecordPath) { 
       lastRecord = ((RecordContainer)lastRecord).findFirstOfType(ri); 
       if (lastRecord == null) { 
        found = false; 
        break; 
       } 
      } 
      hasTiming = found; 
     } 
     ppt.close(); 
     System.out.println(hasTiming); 
    } 
} 
+0

我正在线程中获得'Exception“main”java.io.IOException:java .lang.NoSuchMethodError:org.apache.poi.util.IOUtils.toByteArray(Ljava/io/InputStream; I)[B'是否需要添加任何额外的jar? –

+0

.pptx扩展似乎正在工作,但.ppt扩展得到以上错误。我们能解决这个错误吗? –

+0

哦,这是由于班级道路上的旧罐子。我们是否也可以在Shape对象中检测动画/效果?应该有这样的情况,幻灯片中没有动画,但可能会对Shapes产生影响。我们可以检测到吗? –