2016-06-29 83 views
0

我第一次使用docx4j Java庫,並且在找到一個很好的參考時遇到了一些困難。我需要啓動的是一個簡單的Java類,以只讀模式強制保護Word文檔。我有很多,我可以讀取保護模式並設置它。但是,在保存Word文檔時,更改不會寫入Word文檔。如何用docx4j保存更改Java庫到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,但目前都沒有任何線索的地方出了問題。

回答

0

解決了它。而不是將DocumentSettingsPart添加到已加載的WordprocessingMLPackage中。需要使用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);