2016-06-29 3 views
0

J'utilise la bibliothèque Java docx4j pour la première fois et j'ai des difficultés à trouver une bonne référence. Ce que j'ai besoin de démarrer est une classe Java simple pour appliquer la protection sur un document Word en mode lecture seule. J'ai com jusqu'à présent que je peux lire le mode de protection et le définir. Mais lors de l'enregistrement du document Word, les modifications ne sont pas écrites dans le document Word.Comment conserver les modifications avec la bibliothèque Java docx4j dans le document 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); 

     } 
    } 

} 

Lors de l'exécution de cette classe, j'obtiens la sortie suivante;

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

donc je pense que je ne suis pas mettre à jour le WordprocessingMLPackage ou DocumentSettingsPart correctement dans la méthode de protection, mais ne captez pas la moindre idée où il va mal.

Répondre

0

Résolution du problème. Au lieu d'ajouter le DocumentSettingsPart au WordprocessingMLPackage chargé. L'instance CTDocProtect doit être utilisée pour définir la protection du document sur le contenu.

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