Попробуйте Apache POI Library . Я смог прочитать текстовые документы (.docx) как byte[]
и заблокировать определенные разделы файла для редактирования. В приведенном ниже примере предполагается, что закладки размещаются внутри документа, поэтому укажите, какие разделы должны быть заблокированы, а какие - как редактируемые.
//Open word document with Apache POI
InputStream inputStream = new ByteArrayInputStream(wordDoc);
XWPFDocument document = new XWPFDocument(inputStream);
//Collect all Bookmarks from the document
List<Bookmark> bookmarks = getBookmarks(document);
//Collect all editable sections from the document
List<EditableSection> editableSections = getEditableSections(bookmarks);
//NOW MARK THE SECTIONS IN THE DOCUMENT WHICH ARE EDITABLE
Random random = new Random();
String randomId = Integer.toString(random.nextInt(1000000000));
for(EditableSection section: editableSections)
{
CTPermStart permStart = section.getStart().getCTP().addNewPermStart();
permStart.setEdGrp(STEdGrp.EVERYONE);
permStart.setId(randomId);
CTPerm permEnd = section.getEnd().getCTP().addNewPermEnd();
permEnd.setId(randomId);
}
//Enforce the readonly protection everywhere except where it was marked safe
document.enforceReadonlyProtection(wordProtectPassword, HashAlgorithm.md5);
ByteArrayOutputStream res = new ByteArrayOutputStream();
document.write(res);
return res.toByteArray();
public class EditableSection {
private XWPFParagraph start;
private XWPFParagraph end;
public EditableSection(XWPFParagraph start, XWPFParagraph end) {
this.start = start;
this.end = end;
}
public XWPFParagraph getStart() {
return start;
}
public void setStart(XWPFParagraph start) {
this.start = start;
}
public XWPFParagraph getEnd() {
return end;
}
public void setEnd(XWPFParagraph end) {
this.end = end;
}
}
public class Bookmark {
private String bookmark;
private XWPFParagraph paragraph;
public Bookmark(XWPFParagraph paragraph, String bookmark) {
this.paragraph = paragraph;
this.bookmark = bookmark;
}
public String getBookmark() {
return bookmark;
}
public void setBookmark(String bookmark) {
this.bookmark = bookmark;
}
public XWPFParagraph getParagraph() {
return paragraph;
}
public void setParagraph(XWPFParagraph paragraph) {
this.paragraph = paragraph;
}
}