Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@
import java.util.Set;
import java.util.Stack;

import org.apache.poi.xwpf.usermodel.XWPFAbstractNum;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFNum;
import org.apache.poi.xwpf.usermodel.XWPFNumbering;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.URIConverter;
Expand Down Expand Up @@ -61,7 +63,6 @@
import org.obeonetwork.m2doc.element.impl.MTableImpl.MCellImpl;
import org.obeonetwork.m2doc.element.impl.MTableImpl.MRowImpl;
import org.obeonetwork.m2doc.element.impl.MTextImpl;
import org.obeonetwork.m2doc.services.PaginationServices;
import org.openxmlformats.schemas.officeDocument.x2006.sharedTypes.STOnOff;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDecimalNumber;
Expand All @@ -71,7 +72,6 @@
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTLvl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTNum;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTNumFmt;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTNumbering;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMultiLevelType;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STNumberFormat;
Expand Down Expand Up @@ -1985,19 +1985,30 @@ private void setOrderedListNumbering(Context context, Element element) {
* the {@link Context}
*/
private void createNumbering(Context context) {
final CTAbstractNum res;
final XWPFNumbering numbering = destinationDocument.createNumbering();
final CTNumbering ctNumbering = PaginationServices.getCTNumbering(numbering);
res = ctNumbering.addNewAbstractNum();

// Create CTAbstractNum using the factory to avoid duplicate when creating XWPFAbstractNum
CTAbstractNum res = CTAbstractNum.Factory.newInstance();
res.addNewMultiLevelType().setVal(STMultiLevelType.HYBRID_MULTILEVEL);
BigInteger id = BigInteger.valueOf(ctNumbering.sizeOfAbstractNumArray() - 1);
res.setAbstractNumId(id);
final CTNum ctNum = ctNumbering.addNewNum();
ctNum.setNumId(BigInteger.valueOf(ctNumbering.sizeOfNumArray()));
ctNum.addNewAbstractNumId().setVal(id);
BigInteger abstractNumId = BigInteger.valueOf(numbering.getAbstractNums().size());
res.setAbstractNumId(abstractNumId);
XWPFAbstractNum newAbstractNum = new XWPFAbstractNum(res);
BigInteger finalAbsId = numbering.addAbstractNum(newAbstractNum);

// Update the reference (that was changed through addAbstractNum)
res = newAbstractNum.getCTAbstractNum();
newAbstractNum.setNumbering(numbering);

final CTNum ctNum = CTNum.Factory.newInstance();
ctNum.addNewAbstractNumId().setVal(finalAbsId);
BigInteger numId = BigInteger.valueOf(numbering.getNums().size() + 1);
ctNum.setNumId(numId);
XWPFNum newNum = new XWPFNum(ctNum);
newNum.setNumbering(numbering);
numbering.addNum(newNum);

context.numbering = res;
context.numberingID = ctNum.getNumId();
context.numberingID = numId;
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2016, 2024 Obeo.
* Copyright (c) 2016, 2025 Obeo.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
Expand Down Expand Up @@ -39,6 +39,7 @@
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFFootnote;
import org.apache.poi.xwpf.usermodel.XWPFHeaderFooter;
import org.apache.poi.xwpf.usermodel.XWPFNumbering;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFSDT;
Expand All @@ -55,8 +56,6 @@
import org.obeonetwork.m2doc.template.UserContent;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDecimalNumber;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTNumPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
Expand Down Expand Up @@ -344,8 +343,8 @@ private XWPFParagraph copyParagraph(final IBody outputBody, final Map<String, St
// Copy new paragraph
res.getCTP().set(inputParagraph.getCTP());
// Create relation embedded in run and keep relation id in map (input to output)
updateRelationAndNumberingIds(inputRelationIdToOutputMap, inputPartURIToOutputPartURI, numIDmap,
inputParagraph.getBody(), outputBody, res.getCTP());
updateRelations(inputRelationIdToOutputMap, inputPartURIToOutputPartURI, numIDmap, inputParagraph.getBody(),
outputBody, res.getCTP());
if (bookmarkManager != null) {
updateBookmarks(bookmarkManager, res.getCTP(), inputParagraph.getCTP(), outputBody);
}
Expand All @@ -367,16 +366,24 @@ private XWPFParagraph copyParagraph(final IBody outputBody, final Map<String, St
@SuppressWarnings("resource")
private BigInteger copyNumID(IBody inputBody, IBody outputBody, BigInteger inputNumID) {
final XWPFDocument inputDocument = inputBody.getXWPFDocument();
final XWPFDocument ouptutDocument = outputBody.getXWPFDocument();
final XWPFDocument outputDocument = outputBody.getXWPFDocument();

final XWPFAbstractNum inputNum = inputDocument.getNumbering()
.getAbstractNum(inputNumID.subtract(BigInteger.ONE));
BigInteger numId = null;
XWPFNumbering inputNumbering = inputDocument.getNumbering();
if (inputNumbering != null)
numId = inputNumbering.getAbstractNumID(inputNumID);

if (inputNumbering == null || numId == null) {
// If it's not found in the template, check in the generated document (implicit numbering from template constructs)
return outputDocument.getNumbering().getAbstractNumID(inputNumID);
}
final XWPFAbstractNum inputNum = inputDocument.getNumbering().getAbstractNum(numId);

final XWPFAbstractNum outputNum = new XWPFAbstractNum((CTAbstractNum) inputNum.getCTAbstractNum().copy());
final BigInteger newID = BigInteger.valueOf(ouptutDocument.getNumbering().getAbstractNums().size());
final BigInteger newID = BigInteger.valueOf(outputDocument.getNumbering().getAbstractNums().size());
outputNum.getAbstractNum().setAbstractNumId(newID);
BigInteger outputNumID = ouptutDocument.getNumbering().addAbstractNum(outputNum);
ouptutDocument.getNumbering().addNum(outputNumID);
BigInteger outputNumID = outputDocument.getNumbering().addAbstractNum(outputNum);
outputDocument.getNumbering().addNum(outputNumID);
return outputNumID;
}

Expand Down Expand Up @@ -415,8 +422,8 @@ private XWPFTable copyTable(final IBody outputBody, final Map<String, String> in
res.getCTTbl().set(inputTable.getCTTbl().copy());
copyTableStyle(inputTable, outputBody.getXWPFDocument());
// Create relation embedded in run and keep relation id in map (input to output)
updateRelationAndNumberingIds(inputRelationIdToOutputMap, inputPartURIToOutputPartURI, numIDmap,
inputTable.getBody(), res.getBody(), res.getCTTbl());
updateRelations(inputRelationIdToOutputMap, inputPartURIToOutputPartURI, numIDmap, inputTable.getBody(),
res.getBody(), res.getCTTbl());
if (bookmarkManager != null) {
updateBookmarks(bookmarkManager, res, inputTable);
}
Expand Down Expand Up @@ -480,9 +487,8 @@ private void copyParagraphFragment(Map<String, String> inputRelationIdToOutputMa
try (XmlCursor tmpCursor = outputCursor.newCursor()) {
tmpCursor.toPrevSibling();
tmpCursor.getObject();
updateRelationAndNumberingIds(inputRelationIdToOutputMap, inputPartURIToOutputPartURI,
numIDmap, inputParagraph.getBody(), outputParagraph.getBody(),
tmpCursor.getObject());
updateRelations(inputRelationIdToOutputMap, inputPartURIToOutputPartURI, numIDmap,
inputParagraph.getBody(), outputParagraph.getBody(), tmpCursor.getObject());
// TODO update bookmark manager
}
} while (inputCursor.toNextSibling());
Expand Down Expand Up @@ -621,21 +627,10 @@ private static void copyTableStyle(XWPFTable inputTable, XWPFDocument outputDoc)
* @throws NoSuchAlgorithmException
* if MD5 can't be read
*/
private void updateRelationAndNumberingIds(Map<String, String> inputRelationIdToOutputMap,
private void updateRelations(Map<String, String> inputRelationIdToOutputMap,
Map<URI, URI> inputPartURIToOutputPartURI, Map<BigInteger, BigInteger> numIDmap, IBody inputBody,
IBody outputBody, XmlObject xmlObject)
throws XmlException, InvalidFormatException, NoSuchAlgorithmException, IOException {
if (xmlObject instanceof CTNumPr) {
// copy paragraph numbering
final CTNumPr ctNumPr = (CTNumPr) xmlObject;
final CTDecimalNumber numIdChild = ctNumPr.getNumId();
final BigInteger inputNumID = numIdChild.getVal();
if (inputNumID != null) {
final BigInteger outputNumID = numIDmap.computeIfAbsent(inputNumID,
id -> copyNumID(inputBody, outputBody, id));
numIdChild.setVal(outputNumID);
}
}
final XmlObject idAttr = xmlObject.selectAttribute(RELATIONSHIPS_URI, "id");
if (idAttr != null) {
updateRelationAttribute(inputRelationIdToOutputMap, inputPartURIToOutputPartURI, inputBody, outputBody,
Expand All @@ -649,11 +644,11 @@ private void updateRelationAndNumberingIds(Map<String, String> inputRelationIdTo
}
try (XmlCursor cursor = xmlObject.newCursor()) {
if (cursor.toFirstChild()) {
updateRelationAndNumberingIds(inputRelationIdToOutputMap, inputPartURIToOutputPartURI, numIDmap,
inputBody, outputBody, cursor.getObject());
updateRelations(inputRelationIdToOutputMap, inputPartURIToOutputPartURI, numIDmap, inputBody,
outputBody, cursor.getObject());
while (cursor.toNextSibling()) {
updateRelationAndNumberingIds(inputRelationIdToOutputMap, inputPartURIToOutputPartURI, numIDmap,
inputBody, outputBody, cursor.getObject());
updateRelations(inputRelationIdToOutputMap, inputPartURIToOutputPartURI, numIDmap, inputBody,
outputBody, cursor.getObject());
}
}
}
Expand Down
Loading