`
53873039oycg
  • 浏览: 843864 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[整理]docx4j删除word 2007所有批注

 
阅读更多

       原文见: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操作word" docx4j是一个功能强大的Java类库,用于创建和操作Microsoft Open XML文件,如Word docx、PowerPoint pptx和Excel xlsx。今天,我们将详细介绍如何使用docx4j操作Word文档。 1. Docx4j介绍 docx4...

    docx4j根据书签替换word中的内容

    本篇将详细介绍如何使用`docx4j`根据书签来替换Word文档中的内容。 首先,我们需要理解什么是书签。在Word文档中,书签是一种标记,可以用来标识文本或段落,以便稍后进行引用或操作。在`docx4j`中,我们可以通过...

    docx4j操作word2007

    **docx4j操作word2007** 在IT领域,docx4j是一个非常实用的Java库,专为处理Microsoft Office Open XML (OOXML) 文件格式,如.docx、.xlsx和.pptx而设计。它允许开发人员在Java应用程序中创建、修改和转换这些文档...

    docx4j生成word文档

    最近在做一个出卷系统,需要通过试卷模板从数据库中抽取题目,然后按照模板的样式生成完整的试卷,包括试卷格式的排版和图片的写入。这是用docx4j生成word文档。里面包括完整代码和所需jar包。

    用docx4j操作word书签,在word书签中插入文本

    用docx4j,jar出去word书签,在word书签中插入文本 源码可以通过以下链接查看: https://github.com/xulp-mzl/xlp-core https://github.com/xulp-mzl/xlp-third ...实例: public static void main(String[] args) ...

    使用docx4j 技术操作word的读写

    使用docx4J技术操作word的读写,使用docx4J技术操作word的读写,

    Docx4j office word java

    2. **创建新文档**:使用`org.docx4j.jaxb.Context`类初始化上下文,然后通过`org.docx4j.Docx4J.createDocument()`方法创建一个新的Word文档。 3. **操作文档内容**:可以使用`org.docx4j.model.content.Body`和`...

    最新 docx4j-master

    最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master最新 docx4j-master...

    docx4j所需jar包全

    - 在使用docx4j时,确保你的项目已经正确地添加了所有必要的jar包,包括docx4j的主库和任何额外的转换模块。 - 由于docx4j依赖于OpenJDK的JavaFX库来进行PDF和HTML的生成,所以你需要确认Java环境配置正确且包含这些...

    docx4j所有jar包

    在标题提到的"docx4j所有jar包"中,通常包括docx4j主库以及它所需的依赖包。这些依赖包可能包括处理XML、PDF生成、图片处理等不同功能的库,确保docx4j能顺利完成Word到PDF的转换以及其他操作。 描述中提到的"word...

    docx4j 动态生成表格 (一 )

    这篇博客“docx4j 动态生成表格 (一 )”将引导我们深入理解如何利用docx4j库来创建和操作Word文档中的表格。 首先,让我们了解docx4j的基本概念。docx4j是一个开源项目,它允许开发者通过编程方式创建、修改和...

    java实现多个docx文档合并(基于docx4j)

    在描述中提到,这里已经包含了docx4j 3.3.3版本的所有jar包,你可以直接导入到你的Eclipse工程中。在Eclipse中,右键点击项目,选择"Build Path" -&gt; "Configure Build Path" -&gt; "Libraries" -&gt; "Add Jars",然后浏览...

    docx4j及其依赖包

    **四、docx4j的依赖** 为了使用docx4j,需要在项目中引入对应的依赖包。在Java项目中,可以通过Maven或Gradle等构建工具添加docx4j的依赖。 **五、示例代码** ```java import org.docx4j.*; public class Docx4...

    docx4j相关jar包

    在"docx4j运行需要的jar包,这里是整理好的所有必须的jar包"这一描述中,我们可以推断出这个压缩包包含了一系列docx4j运行所必需的依赖库。通常,一个完整的docx4j项目会包含以下几类jar文件: 1. **docx4j主库**:...

    docx4j全部jar包,包含docx4j-3.2.1.jar、poi-3.14.jar等60个jar包。.zip

    Apache POI是docx4j的一个重要依赖,因为它提供了对低级别Office文档结构的理解,使得docx4j能够解析和构建Word文档的内部XML结构。 除了这两个主要的jar包,其他58个jar包可能包含了docx4j的额外依赖和扩展功能。...

    docx4j项目(javadoc文档、源码及示例)

    docx4j是一款强大的Java库,专为处理Microsoft Office 2007及更高版本的文件格式而设计,包括Word(.docx)、Excel(.xlsx)和PowerPoint(.pptx)文档。它允许开发者在Java应用程序中创建、修改和转换这些文件,...

    docx4j-3.3.3.zip

    主jar包docx4j-3.3.3.jar是docx4j的核心,包含所有主要的类和接口,用于操作OpenXML文档。依赖的jar包则提供了额外的支持,如处理XML、DOM操作和文件I/O等,确保了docx4j能够无缝地与其他Java库集成。 使用docx4j,...

    java实现word合并(poi,jacob,docx4j,plutext)及文件格式转换全家桶

    word合并全家桶,包括横页和竖页兼容合并,里面包含使用文件格式转换,rtf转换为标准的word格式或者其他类型转换,jacob合并word案例及jar包,docx4j合并word案例及jar包,还有poi合并,以及Plutext-Enterprise-3.3.0.6...

    Demo-docx4j-word.zip

    docx4j解析word导入试题入库,支持图片解析,mathType公式解析,word自带数学公式解析

    使用docx4j+docx4j-ImportXHTML实现将html转成word

    html模板填充生成pdf和word

Global site tag (gtag.js) - Google Analytics