2

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

4

1 回答 1

2

这是一种 hack,仅使用 Libre Office 的 POI 3.9 / POI-Scratchpad 3.8 的 PPT 进行了测试。

规范([MS-PPT].pdf / version 3.0 / page 201)说,Byte 18 的 Bit 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();
    }
}
于 2013-04-28T13:32:21.730 回答