以编程方式取消隐藏PPT文件中的幻灯片

时间:2012-12-16 23:26:51

标签: java apache-poi powerpoint hslf

我正在编写一个将PPT文件中的幻灯片转换为png的小工具,我遇到的问题是隐藏幻灯片。如何更改幻灯片在java中可见?我目前正在使用Apache POI转换为PNG,虽然这对剪贴画不起作用,所以我很想先将unoconv导出到PDF,然后将其缩小。但是这样做不会考虑所有隐藏的幻灯片。那么我怎样才能以编程方式将隐藏的幻灯片更改为可见?

1 个答案:

答案 0 :(得分:2)

这是一种黑客行为,仅使用来自Libre Office的PPT和POI 3.9 / POI-Scratchpad 3.8进行了测试。

spec([MS-PPT] .pdf / version 3.0 / page 201)说,字节18 的位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();
    }
}