gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:28:42 26 4
gpt4 key购买 nike

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

最佳答案

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

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();
}
}

关于java - 以编程方式取消隐藏 PPT 文件中的幻灯片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13906513/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com