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