Это еще не поддерживается XWPFRun
. Но мы могли бы определить, есть ли текстовые прогоны, помеченные как удаленные.
Обычные текстовые прогоны XML
выглядят так:
<w:r>
<w:t>Lorem</w:t>
</w:r>
Удаленные текстовые прогоны выглядят так:
<w:del w:id="0" w:author="axel" w:date="2020-04-23T18:57:00Z">
<w:r w:rsidDel="00C63AEB">
<w:delText>ipsum</w:delText>
</w:r>
</w:del>
Таким образом, удаленные прогоны находятся в элементе del
. Но это сложно.
Но хотя текст нормального текстового прогона находится в элементе t
, он находится в элементе delText
для удаленных текстовых прогонов. Так что XWPFRun.getText(0)
вернет null
для удаленных текстовых прогонов, потому что это только обходит элементы t
прогона. XWPFRun.text()
или XWPFRun.toString()
также будет возвращать текст удаленных прогонов, поскольку эти методы пересекают все элементы, которые содержат текст в прогоне.
Кроме того, удаленные текстовые прогоны имеют атрибут rsidDel
в его CTR
объект при получении этого атрибута из не удаленных прогонов получит null
.
И, кроме того, getDelTextList
из CTR
текстового прогона вернет пустой список для не удаленных прогонов, но вернет заполненный список для удаленных прогонов.
Пример обнаружения удаленных прогонов из WordExample.docx
.
import java.io.FileInputStream;
import org.apache.poi.xwpf.usermodel.*;
public class WordReadDeletedRuns {
public static void main(String[] args) throws Exception {
String inFilePath = "./WordExample.docx";
XWPFDocument document = new XWPFDocument(new FileInputStream(inFilePath));
for (IBodyElement bodyElement : document.getBodyElements()) {
if (bodyElement instanceof XWPFParagraph) {
XWPFParagraph paragraph = (XWPFParagraph)bodyElement;
for (IRunElement runElement : paragraph.getIRuns()) {
if (runElement instanceof XWPFRun) {
XWPFRun run = (XWPFRun)runElement;
System.out.println("Text run found: " + run.text());
System.out.println(run.getText(0)); // null for deleted runs
System.out.println(run.getCTR().getRsidDel()); // null for not deleted runs, byte[] for deleted runs
System.out.println(run.getCTR().getDelTextList().size()); // empty list for not deleted runs, filled list for deleted runs
}
}
}
}
document.close();
}
}