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