Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从Apache POI演示文稿中获取动画信息_Java_Apache Poi - Fatal编程技术网

Java 如何从Apache POI演示文稿中获取动画信息

Java 如何从Apache POI演示文稿中获取动画信息,java,apache-poi,Java,Apache Poi,有一个名为AnimationInfo的类,它应该提供演示文稿中的动画信息。但我运气不好,我没能得到它 List<XSLFShape> shapes = slide.getShapes(); for (XSLFShape shape: shapes) { //Need to get animation of this shape here } List shapes=slide.getShapes(); for(XSLFShape形状:形状){ //需要在这里获得此形状的动画 }

有一个名为
AnimationInfo
的类,它应该提供演示文稿中的动画信息。但我运气不好,我没能得到它

List<XSLFShape> shapes = slide.getShapes();
for (XSLFShape shape: shapes) {
  //Need to get animation of this shape here
}
List shapes=slide.getShapes();
for(XSLFShape形状:形状){
//需要在这里获得此形状的动画
}
有人能帮我吗?谢谢


PS:我使用的是POI的
3.17
版本。

如果添加了仅检测动画的功能,则可以检查工作表中的计时信息,该信息很可能识别动画的存在,即,如果添加动画,然后再次删除动画,则可能会出现误报。此外,您需要检查所有幻灯片,直到找到动画为止

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);
    }
}
import java.io.FileInputStream;
导入org.apache.poi.hslf.record.record;
导入org.apache.poi.hslf.record.RecordContainer;
导入org.apache.poi.hslf.record.RecordTypes;
导入org.apache.poi.hslf.usermodel.HSLFSlide;
导入org.apache.poi.sl.usermodel.Slide;
导入org.apache.poi.sl.usermodel.SlideShow;
导入org.apache.poi.sl.usermodel.SlideShowFactory;
导入org.apache.poi.xslf.usermodel.XSLFSlide;
公共类检查{
专用静态最终整数计时记录路径[]={
RecordTypes.ProgTags.typeID,
RecordTypes.ProgBinaryTag.typeID,
RecordTypes.BinaryTagData.typeID,
0xf144
};
公共静态void main(字符串[]args)引发异常{
SlideShow ppt=SlideShowFactory.create(新文件输入流(“no_anim.pptx”);
Slide Slide=ppt.getSlides().get(0);
布尔黑斯明;
if(XSLFSlide的幻灯片实例){
XSLFSlide xsld=(XSLFSlide)幻灯片;
Hasting=xsld.getXmlObject().IsSetting();
}否则{
HSLFSlide hsld=(HSLFSlide)幻灯片;
Record lastRecord=hsld.getSheetContainer();
布尔值=真;
for(int-ri:计时记录路径){
lastRecord=((RecordContainer)lastRecord.findFirstOfType(ri);
if(lastRecord==null){
发现=错误;
打破
}
}
hasting=发现;
}
ppt.close();
系统输出打印(Hasting);
}
}

如果添加了仅检测动画的功能,则可以检查工作表的计时信息,该信息很可能会识别动画的存在,即,如果添加动画,然后再次删除动画,则可能会出现误报。此外,您需要检查所有幻灯片,直到找到动画为止

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);
    }
}
import java.io.FileInputStream;
导入org.apache.poi.hslf.record.record;
导入org.apache.poi.hslf.record.RecordContainer;
导入org.apache.poi.hslf.record.RecordTypes;
导入org.apache.poi.hslf.usermodel.HSLFSlide;
导入org.apache.poi.sl.usermodel.Slide;
导入org.apache.poi.sl.usermodel.SlideShow;
导入org.apache.poi.sl.usermodel.SlideShowFactory;
导入org.apache.poi.xslf.usermodel.XSLFSlide;
公共类检查{
专用静态最终整数计时记录路径[]={
RecordTypes.ProgTags.typeID,
RecordTypes.ProgBinaryTag.typeID,
RecordTypes.BinaryTagData.typeID,
0xf144
};
公共静态void main(字符串[]args)引发异常{
SlideShow ppt=SlideShowFactory.create(新文件输入流(“no_anim.pptx”);
Slide Slide=ppt.getSlides().get(0);
布尔黑斯明;
if(XSLFSlide的幻灯片实例){
XSLFSlide xsld=(XSLFSlide)幻灯片;
Hasting=xsld.getXmlObject().IsSetting();
}否则{
HSLFSlide hsld=(HSLFSlide)幻灯片;
Record lastRecord=hsld.getSheetContainer();
布尔值=真;
for(int-ri:计时记录路径){
lastRecord=((RecordContainer)lastRecord.findFirstOfType(ri);
if(lastRecord==null){
发现=错误;
打破
}
}
hasting=发现;
}
ppt.close();
系统输出打印(Hasting);
}
}

AnimationInfo来自HSLF,而不是XSLF-您可以通过*.getXmlObject()访问转换信息。您喜欢收集哪些信息?请查看用于设置计时信息的方法。@kiwiwings哪个对象在HSLF中具有getXmlObject()方法?我也尝试过HSLF,我知道它只支持PPT扩展,XSLF支持PPTX扩展。我只想检测演示文稿中是否有任何动画应用于bot.ppt和.pptx文件中。你能帮我一下吗?只有XSLF是基于XML的,所以只有XSLF有一个getXmlObject()方法。我会尝试把一些动画检测代码放在一起。。。基本上,我将在HSLF中使用AnimationInfo,并在XSLF中查找计时信息…AnimationInfo来自HSLF,而不是XSLF-您可以通过*.getXmlObject()访问转换信息。您喜欢收集哪些信息?请查看用于设置计时信息的方法。@kiwiwings哪个对象在HSLF中具有getXmlObject()方法?我也尝试过HSLF,我知道它只支持PPT扩展,XSLF支持PPTX扩展。我只想检测演示文稿中是否有任何动画应用于bot.ppt和.pptx文件中。你能帮我一下吗?只有XSLF是基于XML的,所以只有XSLF有一个getXmlObject()方法。我会尝试把一些动画检测代码放在一起。。。基本上,我将在HSLF中使用AnimationInfo并在XSLF中查找计时信息……我在线程“main”java.io.IOException:java.lang.NoSuchMethodError:org.apache.poi.util.IOUtils.toByteArray(Ljava/io/InputStream;I)中得到
异常[B
我需要添加任何额外的jar吗?.pptx扩展似乎可以工作,但.ppt扩展出现上述错误。我们可以修复此错误吗?哦,这是由于类路径中的旧jar。我们也可以在Shape对象中检测动画/效果吗?应该存在sl中没有动画的情况