我试了你这个方法,结果还是会删除整个目录,
我试过的方法有:添加空段落、以及删除时跳过目录后的空段落
另外,如果我不保持修订状态,直接用户无感知删除,这种情况下是不会删除目录的,这是什么原因呢
我试了你这个方法,结果还是会删除整个目录,
我试过的方法有:添加空段落、以及删除时跳过目录后的空段落
另外,如果我不保持修订状态,直接用户无感知删除,这种情况下是不会删除目录的,这是什么原因呢
@ouchli 看起来 TOC 后面的文字是 TOC 字段的一部分。
在这种情况下,我认为我们可以在FieldEnd之后检索run,并移动到另一个段落以解除文本与字段的链接。
FieldCollection fields = doc.getRange().getFields();
for (Field field : fields) {
if (field.getType() == FieldType.FIELD_TOC) {
Node fieldEnd = field.getEnd();
Run run = (Run) fieldEnd.getNextSibling();
if (run != null || run.getText().trim().isEmpty()) {
builder.moveTo(run);
builder.insertParagraph();
}
break;
}
}
// startNode是第一个标题段落, lastHyperLink是最后一个目录段落
Node nextSibling = lastHyperLink.getNextSibling().getNextSibling();
// 这里的逻辑是找两个段落之间的节点,过滤分页符
while (Objects.nonNull(nextSibling) && !nextSibling.equals(startNode)) {
boolean flag = NodeType.PARAGRAPH != nextSibling.getNodeType() ||
(!nextSibling.getText().contains(ControlChar.PAGE_BREAK));
if (flag) {
nodes.add(nextSibling);
}
nextSibling = nextSibling.getNextSibling();
}
Node previousSibling = startNode.getPreviousSibling();
while (Objects.nonNull(previousSibling) && !previousSibling.equals(lastHyperLink.getNextSibling())) {
boolean flag = NodeType.PARAGRAPH != previousSibling.getNodeType() ||
(!previousSibling.getText().contains(ControlChar.PAGE_BREAK));
if (flag && !nodes.contains(previousSibling)) {
nodes.add(previousSibling);
}
previousSibling = previousSibling.getPreviousSibling();
}