首页 > 解决方案 > 需要新建对于每个字符. - docx4j

问题描述

让我们首先从下面的示例输入中获取 <w:r>。其中 <w:t> 包含图 1。现在我需要为 <w:t> 中的每个字符创建新的 <w:r>。(ie) F应该在单独的 <w:r> 中,i应该在单独的 <w:r> 中,g应该在单独的 <w:r> 中,依此类推。像下面的结构。

 <w:r><w:t>F</w:t></w:r>
 <w:r><w:t>i</w:t></w:r>
 <w:r><w:t>g</w:t></w:r>
 <w:r><w:t> </w:t></w:r>
 <w:r><w:t>1</w:t></w:r>
 <w:r><w:t>.</w:t></w:r>

代码片段:

if (run.getParent() instanceof ContentAccessor) { 
 parent = (ContentAccessor) run.getParent(); 
 List<Object> childElements = getAllchildObj(run);
  if (childElements.size() > 0) {
   for (Object child : childElements) {
    int currentRunIndex = parent.getContent().indexOf(run);
    if (child.getClass().getName() == "org.docx4j.wml.RPr") {
            continue;
    }
  if (child instanceof Text) {
   String txt = ((Text) child).getValue();
   List<String> textElementString = textSplit(txt);
  for (String textElement : textElementString) {
     R newRun = factory.createR();
     newRun.setParent(parent);
     RPr tempRunProps = run.getRPr();
    if (tempRunProps != null) {
      String stringRunProps = XmlUtils.marshaltoString(tempRunProps);
    if (stringRunProps != null || stringRunProps.equalsIgnoreCase("")) {
     newRun.setRPr((RPr) XmlUtils.unmarshalString(stringRunProps));
  }
}
     Text t = factory.createText();
     t.setSpace("preserve");
     t.setValue(textElement);
     newRun.getContent().add(t);
     try {
     parent.getContent().add(currentRunIndex, newRun);
} catch (IndexOutOfBoundsException e) {
    logger.error("PM-324e55dc-b928-4c8f-9ecc-bce47b8cb54b: IndexOutOfBoundsException"+e.getMessage());
         }
    }
}else {
     R newRun = factory.createR();
     newRun.setParent(parent);
     currentRunIndex = parent.getContent().indexOf(run);
     RPr runProps = factory.createRPr();
     RPr tempRunProps = run.getRPr();
     if (tempRunProps != null) {
      String stringRunProps = XmlUtils.marshaltoString(tempRunProps);
     if (stringRunProps != null || stringRunProps.equalsIgnoreCase(""){
      newRun.setRPr((RPr) XmlUtils.unmarshalString(stringRunProps));
           }
       }
     newRun.getContent().add(child);
     parent.getContent().add(currentRunIndex, newRun);
      }
   }
}
    parent.getContent().remove(run);
}

上面的代码片段工作正常。如果 run.getParent() 是 ContentAccessor 的实例。对于下面的输入,我没有得到预期的输出,因为 <w:r> 存在于 <w:moveTo> (RunTrackChange) 中。如果 run.getParent() 是 RunTrackChange 的实例,我需要如何处理。

样本输入:

<w:p>
<w:pPr>
<w:pPrChange w:author="Judi Nath" w:date="2021-02-26T11:39:00Z" w:id="18">
  <w:pPr>
    <w:spacing w:line="360" w:lineRule="auto" />
    <w:ind w:left="-480" />
  </w:pPr>
</w:pPrChange>
 </w:pPr>
 <w:bookmarkStart w:name="para10020" w:id="10020" />
 <w:moveToRangeStart w:author="Judi Nath" w:date="2021-02-26T11:39:00Z" w:name="move65231970" w:id="19" />
 <w:proofErr w:type="gramStart" />
 <w:moveTo w:author="Judi Nath" w:date="2021-02-26T11:39:00Z" w:id="20">
<w:r>
  <w:rPr>
    <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" />
    <w:b/>
    <w:sz w:val="24" />
  </w:rPr>
  <w:t>Fig 1.</w:t>
</w:r>
<w:proofErr w:type="gramEnd" />
<w:del w:author="Judi Nath" w:date="2021-02-26T11:39:00Z" w:id="23">
<w:r>
  <w:rPr>
    <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" />
    <w:sz w:val="24" />
  </w:rPr>
  <w:delText xml:space="preserve"> A</w:delText>
</w:r>
</w:moveTo>
<w:bookmarkEnd w:id="10020" />
</w:p>

预期输出:

<w:p>
<w:pPr>
<w:pPrChange w:author="Judi Nath" w:date="2021-02-26T11:39:00Z" w:id="18">
  <w:pPr>
    <w:spacing w:line="360" w:lineRule="auto" />
    <w:ind w:left="-480" />
  </w:pPr>
</w:pPrChange>
 </w:pPr>
 <w:bookmarkStart w:name="para10020" w:id="10020" />
 <w:moveToRangeStart w:author="Judi Nath" w:date="2021-02-26T11:39:00Z" w:name="move65231970" w:id="19" />
 <w:proofErr w:type="gramStart" />
 <w:moveTo w:author="Judi Nath" w:date="2021-02-26T11:39:00Z" w:id="20">
<w:r>
  <w:rPr>
    <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" />
    <w:b/>
    <w:sz w:val="24" />
  </w:rPr>
  <w:t>F</w:t>
</w:r>
<w:r>
  <w:rPr>
    <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" />
    <w:b/>
    <w:sz w:val="24" />
  </w:rPr>
  <w:t>i</w:t>
</w:r>
<w:r>
  <w:rPr>
    <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" />
    <w:b/>
    <w:sz w:val="24" />
  </w:rPr>
  <w:t>g</w:t>
</w:r>
<w:r>
  <w:rPr>
    <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" />
    <w:b/>
    <w:sz w:val="24" />
  </w:rPr>
  <w:t> </w:t>
</w:r>
<w:r>
  <w:rPr>
    <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" />
    <w:b/>
    <w:sz w:val="24" />
  </w:rPr>
  <w:t>1</w:t>
</w:r>
<w:r>
  <w:rPr>
    <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" />
    <w:b/>
    <w:sz w:val="24" />
  </w:rPr>
  <w:t>.</w:t>
</w:r>
<w:proofErr w:type="gramEnd" />
<w:del w:author="Judi Nath" w:date="2021-02-26T11:39:00Z" w:id="23">
<w:r>
  <w:rPr>
    <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" />
    <w:sz w:val="24" />
  </w:rPr>
  <w:delText xml:space="preserve"> </w:delText>
</w:r>
<w:r>
  <w:rPr>
    <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" />
    <w:sz w:val="24" />
  </w:rPr>
  <w:delText xml:space="preserve">A</w:delText>
</w:r>
</w:moveTo>
<w:bookmarkEnd w:id="10020" />
</w:p>

标签: openxmldocx4j

解决方案


推荐阅读