Как определить, что текст был удален запросом на изменение трека? - PullRequest
0 голосов
/ 23 апреля 2020

Я использую apache -poi для чтения файлов Word, и это работает.

Я прочитал текст документа, используя список экземпляров XWPFRun, и это работает нормально.

Но если для документа включено изменение отслеживания, я также получаю экземпляры XWPFRun для текста, который был удаляется, если удаление не было принято. И я не хотел бы включать этот текст.

Так есть ли способ определения состояния изменения дорожки для узла XWPDRun или, что еще лучше, способ анализа документа, как если бы все изменения дорожки были приняты?

1 Ответ

1 голос
/ 23 апреля 2020

Это еще не поддерживается 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();
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...