1

私を夢中にさせている非常に単純な問題があります。基本的に、POI/DOCX4J ライブラリを介して、docx 段落構造とドキュメント アウトラインを抽出したいと考えています。POI paragraph.getLvl() メソッドを使用して、通常の doc ドキュメントで同じタスクを実行しました。docx で同じ結果を得る方法はありますか? docx の目次構造全体を再構築するにはどうすればよいですか?


解決:

私はこのように解決しました:

    Map headingMap = new HashMap();
    headingMap.put("heading 1", 1);
    headingMap.put("heading 2", 2);
    headingMap.put("heading 3", 3);
    headingMap.put("heading 4", 4);
    headingMap.put("heading 5", 5);
    headingMap.put("heading 6", 6);
    headingMap.put("heading 7", 7);
    headingMap.put("heading 8", 8);
    headingMap.put("heading 9", 9);
    
    Iterator<XWPFParagraph> iterator = docx.getParagraphsIterator();
    Styles styles = getStyle(completePath);

    while(iterator.hasNext()){
        XWPFParagraph p = iterator.next();

        if( p != null && p.getStyleID() != null){
            for (Style s : styles.getStyle()){
                if (p.getStyleID().equals(s.getStyleId()) && headingMap.containsKey(s.getName().getVal())){
                    StringBuffer text = new StringBuffer();
                    for(XWPFRun run : p.getRuns()) {
                        text.append(run.toString());
                    }
                }
            }
        }
    }
4

1 に答える 1

2

アウトライン レベルは段落またはスタイル階層で直接設定できるため、実際の課題はスタイル階層をナビゲートしてそれを取得することです。

アウトライン レベルが直接設定されている段落は、次のようになります。

        <w:p>
            <w:pPr>
                <w:outlineLvl w:val="2"/>
            </w:pPr>

段落オブジェクト p を仮定すると、docx4j では、p.getPPr().getOutlineLvl になります。

レベルがいくつかの style で定義されている場合、たとえば:

        <w:style w:type="paragraph" w:styleId="Heading2">
            <w:name w:val="heading 2"/>
            <w:basedOn w:val="Normal"/>
            <w:pPr>
                <w:outlineLvl w:val="1"/>
            </w:pPr>

次のようなものを使用して取得できます(ベースになっている可能性のあるスタイルを無視して):

private int getOutlineLvl(Style s) {
    // Heading 1 is lvl 0
    // There are 9 levels, so 9 will be lvl 8
    // So return 9 for normal text
    if (s==null
            || s.getPPr()==null) return 9;

    OutlineLvl outlineLvl = s.getPPr().getOutlineLvl();
    if (outlineLvl==null) return 9;
    return outlineLvl.getVal().intValue();
}

その場合、段落の pPr には次のようなものが含まれます。

                    <w:pStyle w:val="Heading2"/>

そこからスタイル名を取得し、Styles 部分で検索する必要があります。これを行う方法については、docx4j ソース コードを参照してください。

もう 1 つ知っておく必要があるのは、段落を反復処理する方法です。内部テーブルに関心がないと仮定すると、mdp.getContent() で for ループを使用できます。ここで、mdp はメイン ドキュメント パーツです。詳細については、docx4j チート シートを参照してください。

于 2013-05-28T10:37:35.447 に答える