请问怎么提取docx文件批注内容和他批注的文字位置内容

请问怎么提取docx文件批注内容和他批注的文字位置内容

类似这种

字典的值应该是地址什么什么。值是批注内容

@Tiaohh

要提取 DOCX 文件中的批注内容及其对应的文字位置,您可以使用 Aspose.Words for Java。以下是一个简单的示例代码,展示了如何实现这一功能:

import com.aspose.words.*;

import java.util.HashMap;
import java.util.Map;

public class ExtractComments {
    public static void main(String[] args) throws Exception {
        // 加载 DOCX 文档
        Document doc = new Document("path/to/your/document.docx");

        // 创建一个字典来存储批注内容和对应的文字位置
        Map<String, String> commentsMap = new HashMap<>();

        // 遍历文档中的所有批注
        for (Comment comment : doc.getChildNodes(NodeType.COMMENT, true)) {
            // 获取批注内容
            String commentText = comment.getText();
            // 获取批注的起始位置
            String commentRangeText = comment.getParentParagraph().getRange().getText();
            // 将批注内容和对应的文字位置存入字典
            commentsMap.put(commentRangeText, commentText);
        }

        // 输出结果
        for (Map.Entry<String, String> entry : commentsMap.entrySet()) {
            System.out.println("Text: " + entry.getKey() + " | Comment: " + entry.getValue());
        }
    }
}

在这个示例中,我们首先加载了一个 DOCX 文档,然后遍历所有的批注。对于每个批注,我们提取了其内容和对应的文字位置,并将它们存储在一个字典中。最后,我们输出了所有的批注及其对应的文字位置。

请确保将 "path/to/your/document.docx" 替换为您实际的文件路径。这个解决方案将有效地帮助您提取所需的信息。接下来,您可以根据需要进一步处理这些数据。如果您有其他问题或需要更多帮助,请随时告诉我!

不对 Text里面包含Comment内容

怎么给指定批注内容下面继续回复一条信息

怎么给指定批注内容下面继续回复一条信息呢

@Tiaohh 文档中的注释文本用特殊节点CommentRangeStart和CommentRangeEnd标记,您可以使用本文所示的代码来提取这些节点之间的内容:

Comment和相应的CommentRangeStart/CommentRangeEnd可以通过Comment.id和相应的CommentRangeStart.id/CommentRangeEnd.id属性进行匹配。

对于评论或添加回复,您可以查看

有具体的代码吗 怎么提取

@Tiaohh 在提供的文档链接中,您可以找到提取文本所需的所有代码,这是的代码ExtractContentHelper使用。

此外,您还可以使用以下代码:

doc = aw.Document("input.docx")

comments = doc.get_child_nodes(aw.NodeType.COMMENT, True)
comments_range_start = doc.get_child_nodes(aw.NodeType.COMMENT_RANGE_START, True)

for comment in comments:
    if comment.ancestor is None:  # Check if it's a top-level comment.
        print("Top-level comment.")
        
        for comment_range_start in comments_range_start:
            if comment_range_start.id == comment.id:
                next_sibling = comment_range_start.next_sibling
                while next_sibling is not None:
                    if next_sibling.node_type == aw.NodeType.PARAGRAPH or next_sibling.node_type == aw.NodeType.RUN:
                        break
                    next_sibling = next_sibling.next_sibling
                
                if next_sibling is not None:
                    print(next_sibling.get_text())

那怎么给批注回复呢。比如我输入了一个被批注的内容 查询他的最后一个批注 对最后一个批注进行回复。输入内容是json

Traceback (most recent call last):
File “/Users/dip/Desktop/test_obj/数据处理/2.py”, line 15, in
if comment.ancestor is None: # 检查是否为顶层批注
^^^^^^^^^^^^^^^^
AttributeError: ‘aspose.words.Node’ object has no attribute 'ancestor’不对啊

被标记的文本怎么找不到

import aspose.words as aw
import json

# 设置许可证
lic = aw.License()
lic_path = "../Aspose.Total.Product.Family.lic"
lic.set_license(lic_path)

# 设置文件路径
input_file = "./ZL-2401-005 CSR_Draft 2-update for team review_20250527-0531下载-吴调整-to tz 测试review.docx"
json_output = "./comments.json"

# 加载文档
doc = aw.Document(input_file)

# 存储所有批注信息
comments_data = []

# 获取所有批注
comments = doc.get_child_nodes(aw.NodeType.COMMENT, True)

# 处理每个批注
for i, comment_node in enumerate(comments):
    comment = comment_node.as_comment()

    # 获取批注标记的文本(而不是整个段落)
    marked_text = ""

    try:
        # 获取批注的开始和结束标记
        if comment.comment_range_start and comment.comment_range_end:
            # 使用extract_content方法提取批注范围内的内容
            extracted_nodes = aw.Document.extract_content(
                comment.comment_range_start,
                comment.comment_range_end,
                False  # 不包含标记本身
            )

            # 从提取的节点中获取文本
            for node in extracted_nodes:
                if node.node_type == aw.NodeType.RUN:
                    marked_text += node.as_run().text
                elif hasattr(node, 'get_text'):
                    # 对于其他类型的节点,尝试获取文本
                    text = node.get_text()
                    # 移除特殊字符
                    text = text.replace('\r', '').replace('\u0007', '')
                    marked_text += text
    except Exception as e:
        print(f"获取批注 {i + 1} 标记文本时出错: {str(e)}")
        # 如果extract_content方法失败,尝试其他方法
        try:
            start = comment.comment_range_start
            end = comment.comment_range_end

            if start and end and start.parent_node == end.parent_node:
                parent = start.parent_node
                in_range = False

                for child in parent.child_nodes:
                    if child == start:
                        in_range = True
                        continue
                    elif child == end:
                        break
                    elif in_range and child.node_type == aw.NodeType.RUN:
                        marked_text += child.as_run().text
        except:
            pass

    # 创建批注信息
    comment_info = {
        "序号": i + 1,
        "作者": comment.author,
        "时间": comment.date_time.strftime("%Y-%m-%d %H:%M:%S") if comment.date_time else "",
        "批注内容": comment.get_text().strip(),
        "标记的文本": marked_text.strip()
    }

    comments_data.append(comment_info)

# 保存为JSON
with open(json_output, 'w', encoding='utf-8') as f:
    json.dump(comments_data, f, ensure_ascii=False, indent=2)

print(f"已提取 {len(comments_data)} 个批注到: {json_output}")

# 显示前几个批注的信息
print("\n批注预览:")
for comment in comments_data[:5]:
    print(f"\n批注 {comment['序号']}:")
    print(f"  作者: {comment['作者']}")
    print(f"  批注: {comment['批注内容'][:50]}...")
    print(f"  标记的文本: {comment['标记的文本'][:50] if comment['标记的文本'] else '(无)'}...")

@Tiaohh ExtractContentHelper.extract_content总是返回一个或多个段落节点,因此您需要检查该段落是否包含您要搜索的文本。此外,您使用的 comment.comment_range_start 在 Aspose.Words 中不起作用,所以我不理解这种方法。

您可以使用另一种方法:

doc = aw.Document("Comments.docx")

comments = doc.get_child_nodes(aw.NodeType.COMMENT, True)
comments_range_start = doc.get_child_nodes(aw.NodeType.COMMENT_RANGE_START, True)

for comment in comments:
    comment = comment.as_comment()
    if comment.ancestor is None:  # Check if it's a top-level comment.
        print("Top-level comment.")

        for comment_range_start in comments_range_start:
            comment_range_start = comment_range_start.as_comment_range_start()
            if comment_range_start.id == comment.id:
                next_sibling = comment_range_start.next_sibling
                while next_sibling is not None:
                    if next_sibling.node_type == aw.NodeType.PARAGRAPH or next_sibling.node_type == aw.NodeType.RUN:
                        break
                    next_sibling = next_sibling.next_sibling

                if next_sibling is not None and "marked_text" in next_sibling.get_text():
                    print(next_sibling.get_text())

要回复特定评论,您可以使用以下代码:

comment = doc.get_child(aw.NodeType.COMMENT, 0, True)
comment = comment.as_comment()
comment.add_reply('Joe Bloggs', 'J.B.', datetime.datetime.now(), 'New reply')

例如,如果您找到了想要的评论,可以使用 add_reply 将回复添加到最后,并作为最后一个回复出现在其他回复之后。