`
53873039oycg
  • 浏览: 841798 次
  • 性别: 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操作word2007

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

    docx4j生成word文档

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

    使用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实现docx转pdf

    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-master...

    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项目(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,...

    Demo-docx4j-word.zip

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

    docx4j word转pdf

    此外,docx4j并不直接支持所有Word的功能,所以某些高级特性可能无法完全保留。为了获得更好的转换效果,你可能需要结合其他库或服务来完成更复杂的转换任务。 总之,docx4j是一个强大的Java库,对于需要在应用程序...

    docx4j-3.3.5-API文档-中英对照版.zip

    赠送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...

    docx4j-3.3.5-API文档-中文版.zip

    赠送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...

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

    html模板填充生成pdf和word

    Java结合docx4j生成docx文件

    本篇文章将深入探讨如何使用Java结合docx4j库来创建和操作Microsoft Word的.docx文件。docx4j是一个强大的开源Java库,专门用于读写Open XML格式的文档,包括.docx、.xlsx和.pptx等。 首先,我们来看docx4j的基本...

    使用docx4j将图片签名插入到word中书签位置

    压缩包里包含了必要的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的开源项目

    Docx4j是Java操作office2007+中的Word、Excel、PPT的开源项目,其主要针对WordXML 同时也可以处理Excel和PPT,比POI要强大很多 . Docx4J基于开源协议ASLv2。 ASL是一个广泛适用于社区开源软件并被开源业界所认可的...

    docx4j 替换文本

    使用这个类,我们可以指定一个要查找的文本和一个替换后的文本,然后docx4j会遍历整个文档,将所有匹配的文本替换为新的文本。这种方法可以应用于整个文档,也可以限制在特定的部分,如段落、表格、列表等。 下面是...

Global site tag (gtag.js) - Google Analytics