openxml - 需要新建对于每个字符. - 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>
解决方案
推荐阅读
- python - python3整数除法,舍入零
- python-3.x - Gio.VolumeMonitor:get_volumes() 未更新?
- vue.js - 在创建时设置数据属性以在道具中使用
- android - 在 SharedPreferences 中按字母顺序排列
- python - 函数中的默认值
- php - WooCommerce 学生折扣问题
- laravel - laravel 项目在“http://localhost/public/”中不起作用,页面显示“此页面不起作用”
- mysql - 尝试提交时的事务问题
- android - Android Room 数据库是单例的。为什么没有私有构造函数?
- fortify - 按需将代码上传到 Fortify 进行扫描是否安全?