原文见:http://stackoverflow.com/questions/14738446/how-to-remove-all-comments-from-docx-file-with-docx4j,稍微修改了代码。
import java.io.FileOutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.xml.bind.JAXBElement; import org.docx4j.TraversalUtil; import org.docx4j.TraversalUtil.CallbackImpl; import org.docx4j.XmlUtils; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.Part; import org.docx4j.openpackaging.parts.PartName; import org.docx4j.openpackaging.parts.Parts; import org.docx4j.openpackaging.parts.WordprocessingML.CommentsPart; import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; import org.docx4j.wml.Body; import org.docx4j.wml.CommentRangeEnd; import org.docx4j.wml.CommentRangeStart; import org.docx4j.wml.Comments; import org.docx4j.wml.Comments.Comment; import org.docx4j.wml.ContentAccessor; import org.docx4j.wml.R.CommentReference; import org.jvnet.jaxb2_commons.ppp.Child; //原文见:http://stackoverflow.com/questions/14738446/how-to-remove-all-comments-from-docx-file-with-docx4j public class Docx4j_删除所有批注_S3_Test { public static void main(String[] args) throws Exception { Docx4j_删除所有批注_S3_Test t = new Docx4j_删除所有批注_S3_Test(); t.removeAllComment("f:/saveFile/temp/sys_07_comments - 副本.docx", "f:/saveFile/temp/sys_07_comments - 副本.docx"); } //这里2个路径可以一致 public void removeAllComment(String filePath, String savePath) throws Exception { WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage .load(new java.io.File(filePath)); //清空comments.xml内容 Parts parts = wordMLPackage.getParts(); HashMap<PartName, Part> partMap = parts.getParts(); CommentsPart commentPart = (CommentsPart) partMap.get(new PartName( "/word/comments.xml")); Comments comments = commentPart.getContents(); List<Comment> commentList = comments.getComment(); for (int i = 0, len = commentList.size(); i < len; i++) { commentList.remove(0); } //清空document.xml文件中批注 MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart(); org.docx4j.wml.Document wmlDocumentEl = (org.docx4j.wml.Document) documentPart .getContents(); Body body = wmlDocumentEl.getBody(); CommentFinder cf = new CommentFinder(); new TraversalUtil(body, cf); for (Child commentElement : cf.commentElements) { System.out.println(commentElement.getClass().getName()); Object parent = commentElement.getParent(); List<Object> theList = ((ContentAccessor) parent).getContent(); boolean removeResult = remove(theList, commentElement); System.out.println(removeResult); } wordMLPackage.save(new FileOutputStream(savePath)); } public boolean remove(List<Object> theList, Object bm) { // Can't just remove the object from the parent, // since in the parent, it may be wrapped in a JAXBElement for (Object ox : theList) { if (XmlUtils.unwrap(ox).equals(bm)) { return theList.remove(ox); } } return false; } static class CommentFinder extends CallbackImpl { List<Child> commentElements = new ArrayList<Child>(); public List<Object> apply(Object o) { if (o instanceof javax.xml.bind.JAXBElement && (((JAXBElement) o).getName().getLocalPart() .equals("commentReference") || ((JAXBElement) o).getName().getLocalPart() .equals("commentRangeStart") || ((JAXBElement) o) .getName().getLocalPart().equals("commentRangeEnd"))) { System.out.println(((JAXBElement) o).getName().getLocalPart()); commentElements.add((Child) XmlUtils.unwrap(o)); } else if (o instanceof CommentReference || o instanceof CommentRangeStart || o instanceof CommentRangeEnd) { System.out.println(o.getClass().getName()); commentElements.add((Child) o); } return null; } // to setParent public void walkJAXBElements(Object parent) { List children = getChildren(parent); if (children != null) { for (Object o : children) { if (o instanceof javax.xml.bind.JAXBElement && (((JAXBElement) o).getName().getLocalPart() .equals("commentReference") || ((JAXBElement) o).getName() .getLocalPart() .equals("commentRangeStart") || ((JAXBElement) o) .getName().getLocalPart() .equals("commentRangeEnd"))) { ((Child) ((JAXBElement) o).getValue()) .setParent(XmlUtils.unwrap(parent)); } else { o = XmlUtils.unwrap(o); if (o instanceof Child) { ((Child) o).setParent(XmlUtils.unwrap(parent)); } } this.apply(o); if (this.shouldTraverse(o)) { walkJAXBElements(o); } } } } } }
全文完。
相关推荐
"docx4j操作word" docx4j是一个功能强大的Java类库,用于创建和操作Microsoft Open XML文件,如Word docx、PowerPoint pptx和Excel xlsx。今天,我们将详细介绍如何使用docx4j操作Word文档。 1. Docx4j介绍 docx4...
**docx4j操作word2007** 在IT领域,docx4j是一个非常实用的Java库,专为处理Microsoft Office Open XML (OOXML) 文件格式,如.docx、.xlsx和.pptx而设计。它允许开发人员在Java应用程序中创建、修改和转换这些文档...
最近在做一个出卷系统,需要通过试卷模板从数据库中抽取题目,然后按照模板的样式生成完整的试卷,包括试卷格式的排版和图片的写入。这是用docx4j生成word文档。里面包括完整代码和所需jar包。
使用docx4J技术操作word的读写,使用docx4J技术操作word的读写,
2. **创建新文档**:使用`org.docx4j.jaxb.Context`类初始化上下文,然后通过`org.docx4j.Docx4J.createDocument()`方法创建一个新的Word文档。 3. **操作文档内容**:可以使用`org.docx4j.model.content.Body`和`...
4. **执行转换**:然后,使用`Docx4J`提供的方法将Word文档转换为PDF。 ```java OutputStream os = new FileOutputStream("path_to_output_pdf.pdf"); PdfWriterHelper.write(wordMLPackage, os); os.close(); ``` ...
最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master...
**四、docx4j的依赖** 为了使用docx4j,需要在项目中引入对应的依赖包。在Java项目中,可以通过Maven或Gradle等构建工具添加docx4j的依赖。 **五、示例代码** ```java import org.docx4j.*; public class Docx4...
在"docx4j运行需要的jar包,这里是整理好的所有必须的jar包"这一描述中,我们可以推断出这个压缩包包含了一系列docx4j运行所必需的依赖库。通常,一个完整的docx4j项目会包含以下几类jar文件: 1. **docx4j主库**:...
docx4j是一款强大的Java库,专为处理Microsoft Office 2007及更高版本的文件格式而设计,包括Word(.docx)、Excel(.xlsx)和PowerPoint(.pptx)文档。它允许开发者在Java应用程序中创建、修改和转换这些文件,...
主jar包docx4j-3.3.3.jar是docx4j的核心,包含所有主要的类和接口,用于操作OpenXML文档。依赖的jar包则提供了额外的支持,如处理XML、DOM操作和文件I/O等,确保了docx4j能够无缝地与其他Java库集成。 使用docx4j,...
docx4j解析word导入试题入库,支持图片解析,mathType公式解析,word自带数学公式解析
此外,docx4j并不直接支持所有Word的功能,所以某些高级特性可能无法完全保留。为了获得更好的转换效果,你可能需要结合其他库或服务来完成更复杂的转换任务。 总之,docx4j是一个强大的Java库,对于需要在应用程序...
赠送jar包:docx4j-3.3.5.jar; 赠送原API文档:docx4j-3.3.5-javadoc.jar; 赠送源代码:docx4j-3.3.5-sources.jar; 赠送Maven依赖信息文件:docx4j-3.3.5.pom; 包含翻译后的API文档:docx4j-3.3.5-javadoc-API...
赠送jar包:docx4j-3.3.5.jar; 赠送原API文档:docx4j-3.3.5-javadoc.jar; 赠送源代码:docx4j-3.3.5-sources.jar; 赠送Maven依赖信息文件:docx4j-3.3.5.pom; 包含翻译后的API文档:docx4j-3.3.5-javadoc-API...
html模板填充生成pdf和word
本篇文章将深入探讨如何使用Java结合docx4j库来创建和操作Microsoft Word的.docx文件。docx4j是一个强大的开源Java库,专门用于读写Open XML格式的文档,包括.docx、.xlsx和.pptx等。 首先,我们来看docx4j的基本...
压缩包里包含了必要的docx4j.jar、commons-io-1.4.jar、slf4j-api-1.7.17.jar、freemrkker.jar等架包,导入到到项目后重新build path,然后运行InsertPicture.java文件,(ps:文件的参数替换成自己本地的),便可以...
Docx4j是Java操作office2007+中的Word、Excel、PPT的开源项目,其主要针对WordXML 同时也可以处理Excel和PPT,比POI要强大很多 . Docx4J基于开源协议ASLv2。 ASL是一个广泛适用于社区开源软件并被开源业界所认可的...
使用这个类,我们可以指定一个要查找的文本和一个替换后的文本,然后docx4j会遍历整个文档,将所有匹配的文本替换为新的文本。这种方法可以应用于整个文档,也可以限制在特定的部分,如段落、表格、列表等。 下面是...