Я пытался заменить текст с помощью docx4j. В качестве первого шага я применил закладку для текстов, которые необходимо заменить. Используя закладку, я найду текст и заменю его. Это работает нормально. У меня возникла проблема с заменой, когда контент, добавленный в закладки, находится внутри элемента управления контентом. Может кто-нибудь мне помочь. Заранее спасибо.
Например, в приведенном ниже примере ввода, если значение CTBookmark равно «replacetext_1_0», который находится внутри элемента управления контентом, тогда мне нужно вставить значение замены.
Фрагмент кода:
private void replaceViaBookmarkWithTrack(P p, ObjectFactory factory, String search, String replace, String replaceBkName) throws JAXBException {
List<Object> pContents = p.getContent();
int rIndex = 0;
int runCount=0;
int c = 0;
boolean delete = false;
List<Object> deletes = new ArrayList<Object>();
BigInteger start = null;
int startValue = -1;
RunIns runIns = factory.createRunIns();
RunDel runDel = factory.createRunDel();
for (Object run : pContents) {
Object temp = run;
if (temp instanceof JAXBElement) {
temp = ((JAXBElement<?>) temp).getValue();
}
// if(temp instanceof SdtContentBlock){
// logger.info("Content Control here");
// }
if (temp instanceof CTBookmark) {
if (((CTBookmark) temp).getName().contains(replaceBkName)) {
start = ((CTBookmark) temp).getId();
startValue = start.intValue();
if (c == 0) {
runDel.setAuthor("Auto Process");
runDel.setDate(xmlDate);
runIns.setAuthor("Auto Process");
runIns.setDate(xmlDate);
R newDelRun = factory.createR();
R newInsRun = factory.createR();
DelText deltext = factory.createDelText();
deltext.setSpace("preserve");
deltext.setValue(search);
newDelRun.getContent().add(deltext);
runDel.getCustomXmlOrSmartTagOrSdt().add(newDelRun);
Text t = factory.createText();
t.setSpace("preserve");
t.setValue(replace);
newInsRun.getContent().add(t);
runIns.getCustomXmlOrSmartTagOrSdt().add(newInsRun);
rIndex=runCount;
c++;
delete=true;
}
}
} else if (temp instanceof CTMarkupRange) {
if (((CTMarkupRange) temp).getId().intValue() == startValue) {
deletes.add(run);
delete = false;
}
}
if (delete) {
deletes.add(run);
}
runCount++;
}
for (Object o : deletes) {
p.getContent().remove(o);
}
p.getContent().add(rIndex, runIns);
p.getContent().add(rIndex, runDel);
}
Пример ввода:
<w:p>
<w:pPr>
<w:pStyle w:val="Para"/>
<w:jc w:val="left"/>
<w:rPr/>
</w:pPr>
<w:del/>
<w:ins/>
<w:bookmarkStart w:name="para10007" w:id="10007"/>
<w:r>
<w:rPr/>
<w:t xml:space="preserve">Stress [</w:t>
</w:r>
<w:sdt>
<w:sdtPr>
<w:id w:val="1764518332"/>
<w:alias w:val="1-4"/>
</w:sdtPr>
<w:sdtContent>
<w:sdt>
<w:sdtPr>
<w:id w:val="2002151603"/>
<w:alias w:val="Tag"/>
<w:tag w:val="Tag1"/>
</w:sdtPr>
<w:sdtContent>
<w:r>
<w:rPr>
<w:rStyle w:val="tag"/>
</w:rPr>
<w:t xml:space="preserve">1</w:t>
</w:r>
</w:sdtContent>
</w:sdt>
<w:bookmarkStart w:name="replacetext_1_0" w:id="7"/>
<w:r>
<w:rPr/>
<w:t xml:space="preserve">-</w:t>
</w:r>
<w:bookmarkEnd w:id="7"/>
<w:bookmarkStart w:name="BMMISSING0" w:id="0"/>
<w:sdt>
<w:sdtPr>
<w:id w:val="1537287788"/>
<w:alias w:val="Tag"/>
<w:tag w:val="Tag4"/>
</w:sdtPr>
<w:sdtContent>
<w:r>
<w:rPr>
<w:rStyle w:val="tag"/>
</w:rPr>
<w:t xml:space="preserve">4</w:t>
</w:r>
</w:sdtContent>
</w:sdt>
<w:bookmarkEnd w:id="0"/>
</w:sdtContent>
</w:sdt>
<w:r>
<w:rPr/>
<w:t xml:space="preserve">] </w:t>
</w:r>
<w:r>
<w:rPr/>
<w:t xml:space="preserve">rtreyy</w:t>
</w:r>
<w:bookmarkEnd w:id="10007"/>
</w:p>