Apache POI не находит выделенный текст - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть файл, сохраненный в формате doc, и мне нужно извлечь выделенный текст.У меня есть код, подобный следующему:

HWPFDocument document = new HWPFDocument(fis);
        Range r = document.getRange();
        for (int i=0;i<5;i++) {
            CharacterRun t = r.getCharacterRun(i);
            System.out.println(t.isHighlighted());
            System.out.println(t.getHighlightedColor());
            System.out.println(r.getCharacterRun(i).SPRM_HIGHLIGHT);
            System.out.println(r.getCharacterRun(i));
        }

Ни один из вышеперечисленных методов не показывает, что текст выделен, но когда я его открываю, он подсвечивается.В чем может быть причина, и как узнать, выделен ли текст или нет?

1 Ответ

0 голосов
/ 21 ноября 2018

Выделение текста в Word возможно двумя разными способами.Сначала применяет подсветку к текстовым прогонам.Второй - , применяющий затенение к словам или абзацам .

. Для первого и *.doc, двоичный формат файла Word, apache poi предоставляет методы в CharacterRun .Для второго apache poi предоставляет Paragraph.getShading .Но это устанавливается, только если затенение применяется ко всему абзацу.Если затенение применяется только к одиночным прогонам, apache poi ничего для этого не предоставляет.Таким образом, необходимо использовать базовые SprmOperation s.

Документация Microsoft 2.6.1 Свойства символов описывает sprmCShd80 (0x4866), что является «структурой Shd80, которая задает затенение фона для текста».,Поэтому нам нужно искать это.

Пример:

import java.io.FileInputStream;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.*;

import org.apache.poi.hwpf.sprm.*;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class HWPFInspectBgColor {

 private static void showCharacterRunInternals(CharacterRun run) throws Exception {
  Field _chpx = CharacterRun.class.getDeclaredField("_chpx"); 
  _chpx.setAccessible(true);
  SprmBuffer sprmBuffer = (SprmBuffer) _chpx.get(run);
  for (SprmIterator sprmIterator = sprmBuffer.iterator(); sprmIterator.hasNext(); ) {
   SprmOperation sprmOperation = sprmIterator.next();
System.out.println(sprmOperation);
  }
 }

 static SprmOperation getCharacterRunShading(CharacterRun run) throws Exception {
  SprmOperation shd80Operation = null;
  Field _chpx = CharacterRun.class.getDeclaredField("_chpx"); 
  _chpx.setAccessible(true);
  Field _value = SprmOperation.class.getDeclaredField("_value"); 
  _value.setAccessible(true);
  SprmBuffer sprmBuffer = (SprmBuffer) _chpx.get(run);
  for (SprmIterator sprmIterator = sprmBuffer.iterator(); sprmIterator.hasNext(); ) {
   SprmOperation sprmOperation = sprmIterator.next();
   short sprmValue = (short)_value.get(sprmOperation);
   if (sprmValue == (short)0x4866) { // we have a Shd80 structure, see https://msdn.microsoft.com/en-us/library/dd947480(v=office.12).aspx
    shd80Operation = sprmOperation;
   }
  }
  return shd80Operation;
 }

 public static void main(String[] args) throws Exception {
  HWPFDocument document = new HWPFDocument(new FileInputStream("sample.doc"));
  Range range = document.getRange();
  for (int p = 0; p < range.numParagraphs(); p++) {
   Paragraph paragraph = range.getParagraph(p);
System.out.println(paragraph);
   if (!paragraph.getShading().isEmpty()) {
System.out.println("Paragraph's shading: " + paragraph.getShading());
   }

   for (int r = 0; r < paragraph.numCharacterRuns(); r++) {
    CharacterRun run = paragraph.getCharacterRun(r);
System.out.println(run);
    if (run.isHighlighted()) {
System.out.println("Run's highlighted color: " + run.getHighlightedColor());
    }
    if (getCharacterRunShading(run) != null) {
System.out.println("Run's Shd80 structure: " + getCharacterRunShading(run));
    }
   }
  }
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...