0

初めて docx4j Java ライブラリを使用していますが、適切なリファレンスを見つけるのに苦労しています。開始する必要があるのは、Word ドキュメントを読み取り専用モードで保護するための単純な Java クラスです。保護モードを読み取って設定できるようになりました。ただし、Word 文書を保存すると、変更は Word 文書に書き込まれません。

public class Doc4JPOC {

    public static void main(String[] args) {

        String docName = "/Users/petervannes/Desktop/Unprotected document.docx";
//      String docName = "/Users/petervannes/Desktop/Protected document.docx" ;

        Doc4JPOC d4j = new Doc4JPOC();

        d4j.isProtected(docName);
        d4j.protect(docName);
        d4j.isProtected(docName);

    }

    private void protect(String filename) {

        try {
            WordprocessingMLPackage wordMLPackage = Docx4J.load(new java.io.File(filename));

            MainDocumentPart mdp = wordMLPackage.getMainDocumentPart();

            Relationship rs = mdp.getRelationshipsPart().getRelationshipByType(Namespaces.SETTINGS);
            DocumentSettingsPart dsp = (DocumentSettingsPart) mdp.getRelationshipsPart().getPart(rs);

            // Update settings.xml
            List<Object> nodes = dsp.getJAXBNodesViaXPath("//w:documentProtection", true);
            for (Object obj : nodes) {
                CTDocProtect cdtP = ((CTDocProtect) obj);
                cdtP.setEnforcement(Boolean.TRUE);
                cdtP.setEdit(STDocProtect.READ_ONLY);
            }

            // Write updated settings.xml to document
            wordMLPackage.addTargetPart(dsp);
//            wordMLPackage.save(new java.io.File(filename));

          Docx4J.save(wordMLPackage, new java.io.File(filename), 0);
          System.out.println("Protected document " + filename) ;

        } catch (Docx4JException ex) {
            Logger.getLogger(Doc4JPOC.class.getName()).log(Level.SEVERE, null, ex);
        } catch (JAXBException jex) {
            Logger.getLogger(Doc4JPOC.class.getName()).log(Level.SEVERE, null, jex);

        }

    }

    private void isProtected(String filename) {

        Boolean isProtectionEnforced = false;
        STDocProtect editMode = STDocProtect.NONE;

        try {
            WordprocessingMLPackage wordMLPackage = Docx4J.load(new java.io.File(filename));

            MainDocumentPart mdp = wordMLPackage.getMainDocumentPart();
            Relationship rs = mdp.getRelationshipsPart().getRelationshipByType(Namespaces.SETTINGS);
            DocumentSettingsPart dsp = (DocumentSettingsPart) mdp.getRelationshipsPart().getPart(rs);

            System.out.println("Partname : " + dsp.getPartName());

            List<Object> nodes = dsp.getJAXBNodesViaXPath("//w:documentProtection", true);
            for (Object obj : nodes) {
                CTDocProtect cdtP = ((CTDocProtect) obj);

                isProtectionEnforced = cdtP.isEnforcement();
                editMode = cdtP.getEdit();

                System.out.println("Enforced: " + cdtP.isEnforcement());
                System.out.println("Edit: " + cdtP.getEdit());

            }

            if (isProtectionEnforced) {
                System.out.println("Protection is enabled , protection mode is " + editMode.toString());
            } else {
                System.out.println("Protection is disabled");
            }

        } catch (Docx4JException ex) {
            Logger.getLogger(Doc4JPOC.class.getName()).log(Level.SEVERE, null, ex);
        } catch (JAXBException jex) {
            Logger.getLogger(Doc4JPOC.class.getName()).log(Level.SEVERE, null, jex);

        }
    }

}

このクラスを実行すると、次の出力が得られます。

Partname : /word/settings.xml
Protection is disabled
Protected document /Users/petervannes/Desktop/Unprotected document.docx
Partname : /word/settings.xml
Protection is disabled

したがって、保護メソッドで WordprocessingMLPackage または DocumentSettingsPart を正しく更新していないと思われますが、現在、どこで問題が発生するのかわかりません。

4

2 に答える 2

0

docx4j v3.3.0 については、http://www.docx4java.org/forums/docx-java-f6/password-set-for-documentprotection-not-accepted-in-msword-t2427.html#p8290 を参照してください。

于 2016-07-05T04:06:30.517 に答える
0

解決しました。読み込まれた WordprocessingMLPackage に DocumentSettingsPart を追加する代わりに。コンテンツにドキュメント保護を設定するには、CTDocProtect インスタンスを使用する必要があります。

CTDocProtect cdtP = new CTDocProtect();
cdtP.setEnforcement(Boolean.TRUE);
cdtP.setEdit(STDocProtect.READ_ONLY);

dsp.getContents().setDocumentProtection(cdtP);
Docx4J.save(wordMLPackage, new java.io.File(filename), 0);
于 2016-06-30T07:18:33.533 に答える