feat: bookmark replace

This commit is contained in:
zzs 2025-03-08 10:22:52 +08:00
parent 358f5b2b6d
commit bad5ee4cc1

View File

@ -414,19 +414,43 @@ public class BookmarkExec {
BigInteger numId = ctNumPr.getNumId().getVal();
BigInteger ilvl = ctNumPr.getIlvl().getVal();
XWPFRun originRun = bookmarkParagraph.getRuns().get(0);
// 确定原列表段落的范围
int bookmarkPos = doc.getPosOfParagraph(bookmarkParagraph);
int endPos = findListEndPosition(doc, bookmarkPos, numId);
// 插入新的列表项
insertNewListItems(doc, newListItems, bookmarkPos, numId, ilvl, bookmarkParagraph, originRun);
insertNewListItems(doc, newListItems, bookmarkPos, numId, ilvl, bookmarkParagraph);
// 删除原列表段落
removeOriginalListParagraphs(doc, bookmarkPos, endPos);
removeOriginalListParagraphs(doc, bookmarkName);
}
private static void removeOriginalListParagraphs(XWPFDocument doc, String bookmarkName) {
List<XWPFParagraph> paragraphs = doc.getParagraphs();
List<Integer> indexesToRemove = new ArrayList<>();
for (int i = 0; i < paragraphs.size(); i++) {
XWPFParagraph paragraph = paragraphs.get(i);
CTP ctp = paragraph.getCTP();
List<CTBookmark> bookmarks = ctp.getBookmarkStartList();
List<BookmarkInfo> info = queryBookmarkInfo(paragraph);
Map<String, BookmarkInfo> bkMap = info.stream()
.collect(Collectors.toMap(BookmarkInfo::getBookmarkName, bk -> bk));
for (CTBookmark bookmark : bookmarks) {
if (bookmark.getName().equals(bookmarkName)) {
if (bkMap.containsKey(bookmarkName) && bkMap.get(bookmarkName).isListMark()) {
indexesToRemove.add(i);
break;
}
}
}
}
Collections.reverse(indexesToRemove);
for (int index : indexesToRemove) {
doc.removeBodyElement(doc.getBodyElements().indexOf(paragraphs.get(index)));
}
}
private static XWPFParagraph findBookmarkParagraph(XWPFDocument doc, String bookmarkName) {
for (XWPFParagraph p : doc.getParagraphs()) {
for (CTBookmark bookmark : p.getCTP().getBookmarkStartList()) {
@ -469,14 +493,8 @@ public class BookmarkExec {
return (pPr != null) ? pPr.getNumPr() : null;
}
private static void removeOriginalListParagraphs(XWPFDocument doc, int start, int end) {
for (int i = end - 1; i >= start; i--) {
doc.removeBodyElement(doc.getPosOfParagraph(doc.getParagraphs().get(i)));
}
}
private static void insertNewListItems(XWPFDocument doc, List<String> items, int insertPos,
BigInteger numId, BigInteger ilvl, XWPFParagraph originalPara, XWPFRun xwpfRun) {
BigInteger numId, BigInteger ilvl, XWPFParagraph originalPara) {
// 获取插入位置的游标锚点
XmlCursor cursor = findInsertCursor(doc, insertPos);