在MS-Word 2010中,文件下有一个选项 - >在共享之前检查文档是否存在问题的信息。这使得可以处理跟踪更改(到新的最新版本)并立即从文档中删除所有注释和注释。
这种可能性在docx4j中是否也可用,或者我是否需要调查相应的JAXB-Objects并编写遍历查找器?
手动执行此操作可能需要大量工作,因为我必须将RunIns
(w:ins
)添加到R
(w:r
)并删除RunDel
(w:del
)。我还在w:del
内看到w:ins
一次。在这种情况下,我不知道这是否反之亦然或更深层次的嵌套。
进一步的研究带来了这个XSLT: https://github.com/plutext/docx4all/blob/master/docx4all/src/main/java/org/docx4all/util/ApplyRemoteChanges.xslt 我无法在docx4j中运行它,而是通过手动解压缩docx并解压缩document.xml。在普通document.xml上应用xslt后,我再次将其包装在docx容器中,以使用MS-Word打开它。结果与使用MS-Word本身接受修订时的结果不同。更具体:XSLT删除了已删除的标记文本(在表中),但没有删除文本前的列表点。这在我的文档中经常出现。
如果这个请求不能轻易解决,我会改变约束。我有足够的方法来获取ContentAccessor的所有文本,作为String
。 ContentAccessor可以是P
或Tc
。字符串应位于R
内或RunIns
内(R
内)为此,我有一个半解决方案。有趣的部分从else if (child instanceof RunIns) {
开始。但如上所述,我不确定嵌套的del / ins语句是如何出现的,以及它是否能很好地处理它们。并且结果仍然不同于我之前用MS-Word准备文档。
//Similar to:
//http://www.docx4java.org/forums/docx-java-f6/how-to-get-all-text-element-of-a-paragraph-with-docx4j-t2028.html
private String getAllTextfromParagraph(ContentAccessor ca) {
String result = "";
List<Object> children = ca.getContent();
for (Object child : children) {
child = XmlUtils.unwrap(child);
if (child instanceof Text) {
Text text = (Text) child;
result += text.getValue();
} else if (child instanceof R) {
R run = (R) child;
result += getTextFromRun(run);
}
else if (child instanceof RunIns) {
RunIns ins = (RunIns) child;
for (Object obj : ins.getCustomXmlOrSmartTagOrSdt()) {
if (obj instanceof R) {
result += getTextFromRun((R) obj);
}
}
}
}
return result.trim();
}
private String getTextFromRun(R run) {
String result = "";
for (Object o : run.getContent()) {
o = XmlUtils.unwrap(o);
if (o instanceof R.Tab) {
Text text = new Text();
text.setValue("\t");
result += text.getValue();
}
if (o instanceof R.SoftHyphen) {
Text text = new Text();
text.setValue("\u00AD");
result += text.getValue();
}
if (o instanceof Br) {
Text text = new Text();
text.setValue(" ");
result += text.getValue();
}
if (o instanceof Text) {
result += ((Text) o).getValue();
}
}
return result;
}
答案 0 :(得分:1)
https://github.com/plutext/docx4j/commit/309a8e4008553452ebe675e81def30aab97542a2?w=1添加了一种只转换一个Part的方法,并使用示例代码来接受更改。
XSLT正是您所发现的(重新许可为Apache 2):
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:WX="http://schemas.microsoft.com/office/word/2003/auxHint"
xmlns:aml="http://schemas.microsoft.com/aml/2001/core"
xmlns:w10="urn:schemas-microsoft-com:office:word"
xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:ext="http://www.xmllab.net/wordml2html/ext"
xmlns:java="http://xml.apache.org/xalan/java"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
version="1.0"
exclude-result-prefixes="java msxsl ext o v WX aml w10">
<xsl:output method="xml" encoding="utf-8" omit-xml-declaration="no" indent="yes" />
<xsl:template match="/ | @*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="w:del" />
<xsl:template match="w:ins" >
<xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
您需要添加对MSDN链接中标识的其他元素的支持。如果你这样做,我很乐意得到拉取请求