当读取到一个文档时,这个文档是有添加批注或者有修订记录

当读取到一个文档时,这个文档是有添加批注或者有修订记录,怎么判断有修订记录和批注,以及怎么忽略评论,和去除修订模式

@ouchli 您可以使用 Document.hasRevisions 属性来检测文档是否有修订。 您可以使用 Revisions.acceptAll()Revisions.rejectAll() 方法接受或拒绝文档中的修订。

要检测文档是否有注释,您可以简单地获取文档中 NodeType.COMMENT 的子级。

你好,请问怎么获取文档中的 所有修订处的位置

@ouchli 您可以使用 LayoutCollector 来确定节点所在的页码。因此,您可以获取具有修订版本的节点,并使用 LayoutCollectorLayoutEnumerator 来获取这些节点的位置。

怎么获取具有修订版本的节点呢

@ouchli 您可以使用以下代码:

Document doc = new Document("C:\\Temp\\in.docx");

for (Node node : (Iterable<Node>)doc.getChildNodes(NodeType.ANY, true))
{
    if (isRevison(node))
    {
        // This node has revision.
    }
}
private static boolean isRevison(Node node)
{
    if (node instanceof Inline) {
        Inline inline = (Inline)node;
        return inline.isDeleteRevision() || inline.isMoveToRevision() || inline.isMoveFromRevision() || inline.isFormatRevision() || inline.isInsertRevision();
    }

    if (node instanceof Paragraph) {
        Paragraph para = (Paragraph)node;
        return para.isDeleteRevision() || para.isMoveToRevision() || para.isMoveFromRevision() || para.isFormatRevision() || para.isInsertRevision();
    }

    return false;
}

好的,谢谢,还有就是请问可以给某个Node 节点添加批注吗?

@ouchli 无法手动向节点添加修订。 您只能使用 Aspose.Words 以编程方式进行更改。 请参阅我们的文档以了解如何使用修订版:
https://docs.aspose.com/words/java/track-changes-in-a-document/

你好,我使用如下代码之后:报错了,请问为什么会报错呢

Document doc = new Document("D:\\Desktop\\文档.docx");
NodeCollection<Comment> childNodes = doc.getChildNodes(NodeType.COMMENT, true);
for (Comment childNode : childNodes) {
    childNode.addReply("作者", "", new Date(), "回复");
}
doc.save("D:\\Desktop\\文档1.docx");

@ouchli 由于现有的 MS Office 限制,文档中仅允许 1 级回复。 因此您无法将回复添加到另一个回复中。 您应该像这样修改您的代码:

Document doc = new Document("C:\\Temp\\in.docx");
NodeCollection<Comment> childNodes = doc.getChildNodes(NodeType.COMMENT, true);
for (Comment childNode : childNodes)
{
    // Check whether reply can be added to the comment
    if (childNode.getParentId() < 0)
        childNode.addReply("Aspose", "", new Date(), "Test comment");
}
doc.save("C:\\Temp\\out.docx");

但是我这个批注目前是没有任何回复的,所以应该是支持添加的
文档.docx (63.5 KB)

@ouchli 上面的代码正确添加了对文档中评论的回复。 这是上面代码在我这边产生的输出:
out.docx (54.1 KB)

1 Like

好的 谢谢您,再问一下
我使用 document.deepClone() 拷贝之后的Document与原来的Document有什么区别吗?

java.lang.IllegalArgumentException: The newChild was created from a different document than the one that created this node.

使用克隆文档之后会报这个错

@ouchli 克隆文档时,会创建该文档的单独实例。 因此,对克隆文档所做的更改不会对原始文档产生任何影响。
由于克隆文档和原始文档是文档对象的不同实例,因此这些文档之间的节点不能互换。 需要将节点从一个文档导入到另一个文档,以便在另一个文档中使用一个文档中的节点。

我从克隆的文档里面得到一个段落,要给源文档的这个段落加批注,然后使用

documentSource.importNode(paragraph, true);

去导入这个段落节点之后,还是会报错

java.lang.IllegalArgumentException: The newChild was created from a different document than the one that created this node.'

@ouchli 将节点从一个文档导入到另一个文档后,您可以在目标文档中使用它。 例如看下面的代码:

Document doc = new Document("C:\\Temp\\in.docx");
Document clone = doc.deepClone();
        
// Import node from source document to the cloned document.
Paragraph srcParagraph = doc.getFirstSection().getBody().getFirstParagraph();
Paragraph importedParagraph = (Paragraph)clone.importNode(srcParagraph, true);
// The importedParagraph now belongs to the cloned document
// and can be used in it. 
        
// Add imported node into the cloned document.
clone.getFirstSection().getBody().appendChild(importedParagraph);
    
clone.save("C:\\Temp\\out.docx");