2

PPT ファイルのスライドを png に変換する小さなツールを作成しています。問題は非表示のスライドにあります。スライドを変更してJavaで表示するにはどうすればよいですか? 私は現在、PNGへの変換にApache POIを使用していますが、これはクリップアートでは機能しないため、最初にunoconvを使用してPDFにエクスポートし、次にそれを縮小したいと考えています。ただし、このようにすると、すべての非表示のスライドが考慮されません。では、非表示のスライドを表示するようにプログラムで変更するにはどうすればよいでしょうか?

4

1 に答える 1

2

これは一種のハックであり、POI 3.9 / POI-Scratchpad 3.8 を使用した Libre Office の PPT でのみテストされています。

仕様([MS-PPT].pdf / バージョン 3.0 / ページ 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();
    }
}
于 2013-04-28T13:32:21.730 に答える