2015-05-05 4 views
0

Я пытаюсь использовать этот код (POI 3,11) для извлечения текста из DOCX файла:POI игнорируя некоторые фрагменты DOCX

XWPFDocument doc = new XWPFDocument(OPCPackage.open("sample.docx")); 
     for (XWPFParagraph p : doc.getParagraphs()) { 
      List<XWPFRun> runs = p.getRuns(); 
      if (runs != null) { 
       for (XWPFRun r : runs) { 
        String text = r.getText(0); 
        System.out.println(text); 
       } 
      } 
     } 

Вот файл document.xml внутри sample.docx:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<w:document xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"> 
    <w:body> 
     <w:p> 
      <w:pPr> 
       <w:pStyle w:val="Normal"/> 
       <w:rPr/> 
      </w:pPr> 
      <w:bookmarkStart w:id="0" w:name="__DdeLink__59_1605705532"/> 
      <w:bookmarkEnd w:id="0"/> 
      <w:r> 
       <w:rPr/> 
       <w:t>A</w:t>  // THIS PRINT! 
       <w:tab/> 
       <w:t>B</w:t>  // THIS IS NOT! WHY?! 
      </w:r> 
     </w:p> 
     <w:sectPr> 
      <w:type w:val="nextPage"/> 
      <w:pgSz w:h="16838" w:w="11906"/> 
      <w:pgMar w:bottom="1134" w:footer="0" w:gutter="0" w:header="0" w:left="1134" w:right="1134" w:top="1134"/> 
      <w:pgNumType w:fmt="decimal"/> 
      <w:formProt w:val="false"/> 
      <w:textDirection w:val="lrTb"/> 
      <w:docGrid w:charSpace="4294961151" w:linePitch="240" w:type="default"/> 
     </w:sectPr> 
    </w:body> 
</w:document> 

Когда я запускаю код, это приведет к последующей деятельности:

A

Я не ип что по неизвестным причинам некоторые фрагменты (буква B) из текста игнорируются (если я открываю файл с помощью LibreOffice, он успешно показывается).

+0

Вас интересует только распечатка содержимого пробега? Если это так, [XWPFRun.text()] (https://poi.apache.org/apidocs/org/apache/poi/xwpf/usermodel/XWPFRun.html#text%28%29), вероятно, вы хотите позвонить - который обрабатывает преобразование новых строк/tabs/etc в их текстовые эквиваленты и возвращает весь запуск как строку – Gagravarr

+0

Как ни странно, я не мог найти этот метод в классе XWPFRun ... но XWPFParagraph.getText() делает то же самое ... Однако Я получаю доступ к тексту в «run level», чтобы изменить его с старого на новый. – dellasavia

+0

Попробуйте обновить - похоже, что это было добавлено в Apache POI 3.12 beta 1 или попробуйте использовать XWPFRun.toString() для чего-то примерно похожего на 3.11 – Gagravarr

ответ

0

Просмотрев эту ссылку (http://apache-poi.1045710.n5.nabble.com/POI-3-10-1-XWPFRun-getText-Does-Not-Return-Full-Line-of-Text-tp5716539p5716541.html), я понял, что каждый абзац может иметь кратные прогоны (фрагменты текста), и каждый может иметь другой стиль или нет, в зависимости от истории файла.

В этом выпуске файл содержит один абзац с двумя фрагментами текста. В String text = r.getText(0) я поймал только одного из них.

Как я не мог найти в API метод, который возвращает все фрагменты абзаца, мне нужно сделать обходной путь для решения проблемы:

if (runs != null) { 
    for (XWPFRun r : runs) { 
     int i = 0; 
     while (true) { 
      try { 
       String text = r.getText(i); 

       if (text == null) { 
        break; 
       } 

       System.out.println(text); 
       i++; 
      } catch (IndexOutOfBoundsException ex) { 
       break; 
      } 
     }  
    } 
} 

Я надеюсь, что это может помочь кому-то в день!

Смежные вопросы