Откройте для себя названия / параграфы в документах Word - PullRequest
1 голос
/ 16 марта 2011

Я пытаюсь найти абзацы / заголовки в текстовых документах.
Я использую Apache POI для этого.
Пример, который я использую:

            fs = new POIFSFileSystem(new FileInputStream(filesname));
            HWPFDocument doc = new HWPFDocument(fs);
            WordExtractor we = new WordExtractor(doc);
            ArrayList titles = new ArrayList();

            try {
                for (int i = 0; i < we.getText().length() - 1; i++) {
                    int startIndex = i;
                    int endIndex = i + 1;
                    Range range = new Range(startIndex, endIndex, doc);
                    CharacterRun cr = range.getCharacterRun(0);

                    if (cr.isBold() || cr.isItalic() || cr.getUnderlineCode() != 0) {
                        while (cr.isBold() || cr.isItalic() || cr.getUnderlineCode() != 0) {
                            i++;
                            endIndex += 1;
                            range = new Range(endIndex, endIndex + 1, doc);
                            cr = range.getCharacterRun(0);
                        }
                        range = new Range(startIndex, endIndex - 1, doc);
                        titles.add(range.text());
                    }

                }
            }
            catch (IndexOutOfBoundsException iobe) {
                //sometimes this happens have to find out why.
            }`enter code here`

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

Кто-нибудь есть идея?

Ответы [ 3 ]

2 голосов
/ 16 марта 2011

Что ж, можно подумать о том, чтобы попробовать что-то из следующего:

  • cr.getFontSize() можно использовать в начале абзаца, чтобы увидеть, меняет ли диапазон размер шрифта.Что в сочетании с жирным шрифтом, курсивом или подчеркнутым будет хорошим идентификатором.
  • cr.getFontName() также может использоваться для определения, когда и где шрифт изменяется в данном диапазоне.
  • cr.getColor()была бы еще одна возможность помочь определить, использует ли пользователь разные цвета для шрифта.

Полагаю, я бы перебирал диапазон и создавал несколько элементов CharacterRun каждый раз при изменении характеристик текста.Затем оцените каждый элемент на основе позиции в абзаце, а также всех вышеупомянутых характеристик (размер, цвет, название, жирный шрифт, курсив и т. Д.).Возможно, создайте какую-то весовую шкалу, основанную на наиболее распространенных значениях.

Также может быть полезно создать объект Title и сохранить значения для каждого набора характеристик, чтобы помочь оптимизировать поиск при последующих запусках символов.в том же документе.

1 голос
/ 31 марта 2011

Возможно, вы захотите взглянуть на метод buildParagraphTagAndStyle в WordExtractor Тики: https://svn.apache.org/repos/asf/tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/WordExtractor.java

Для HWPF (.doc), чтобы вызвать его, вы должны сделать:

      StyleDescription style = 
         document.getStyleSheet().getStyleDescription(p.getStyleIndex());
      TagAndStyle tas = buildParagraphTagAndStyle(
            style.getName(), (parentTableLevel>0)
      );

Для XWPF (.docx) вы должны сделать:

      XWPFStyle style = styles.getStyle(paragraph.getStyleID());

      TagAndStyle tas = WordExtractor.buildParagraphTagAndStyle(
            style.getName(), paragraph.getPartType() == BodyType.TABLECELL
      );
0 голосов
/ 27 февраля 2014

Будет проще, если вы обработаете данные, преобразовав их в абзацы.

 WordExtractor we = new WordExtractor(doc);
 String[] para = we.getParagraphText();

Тогда работайте с абзацами мудро.Если ваш код уже не может определить заголовки, вы можете проверить жирный шрифт и подчеркивание в каждом абзаце.

Параграфы работают следующим образом:

for(int i=0;i<para.length;i++)
{
System.out.println("Length of paragraph "+(i+1)+": "+ para[i].length());
    System.out.println(para[i].toString());
}

Рабочий примернайдено здесь: http://sanjaal.com/java/120/java-file/how-to-read-doc-file-using-java-and-apache-poi/#comments

...