2016-06-29 7 views
0

Я впервые использую библиотеку Java docx4j и затрудняюсь найти хорошую ссылку. Мне нужно запустить простой Java-класс для обеспечения защиты документа Word в режиме только для чтения. Я знаю, что я могу прочитать режим защиты и установить его. Но при сохранении документа Word изменения не записываются в документ Word.Как перенести изменения с помощью библиотеки docx4j Java в документ слова

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