Найти и заменить контент, находящийся внутри Content Control-docx4j - PullRequest
0 голосов
/ 23 апреля 2020

Я пытался заменить текст с помощью 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>
...