Получение java.lang.IndexOutOfBoundsException при преобразовании файла документа в txt с использованием POI apache

Я использую утилиту apache poi (poi-scratchpad-3.9.jar и связанную версию 3.9 POI jar) для преобразования файла документа в txt. Он работает с большинством файлов, но я получаю исключение, как показано ниже.

java.lang.IndexOutOfBoundsException: 0 not accessible in a list of length 0
at org.apache.poi.util.IntList.get(IntList.java:346)
at org.apache.poi.poifs.storage.BlockAllocationTableReader.fetchBlocks(BlockAllocationTableReader.java:224)
at org.apache.poi.poifs.storage.BlockListImpl.fetchBlocks(BlockListImpl.java:123)
at org.apache.poi.poifs.storage.SmallDocumentBlockList.fetchBlocks(SmallDocumentBlockList.java:30)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.processProperties(POIFSFileSystem.java:521)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:163)
at org.apache.poi.hwpf.HWPFDocumentCore.verifyAndBuildPOIFS(HWPFDocumentCore.java:106)
at org.apache.poi.hwpf.HWPFDocument.<init>(HWPFDocument.java:174)

Кодекс следующий

fileInputStream = new FileInputStream(file.getAbsolutePath());

// A HWPFDocument used to read document file from FileInputStream
HWPFDocument doc = new HWPFDocument(fileInputStream);

// A WordExtractor used to read textual content from document
WordExtractor docExtractor = new WordExtractor(doc);

// This Array stores each line from the document file.
String[] docArray = docExtractor.getParagraphText();
StringBuilder contents = new StringBuilder();
for (int i = 0; i < docArray.length; i++) {
    if (docArray[i] != null) {
        contents.append(docArray[i]);
        contents.append(System.getProperty("line.separator"));
    }
}
isConverted = FileDirectoryOperations.writeTextOutputFile(targetFilePath, contents.toString());

мы получаем исключение в строке HWPFDocument doc = new HWPFDocument(fileInputStream);

есть ли у нас какое-либо исправление для этого.

пожалуйста, поделитесь своими комментариями.

Заранее спасибо.

Сурабх


person user3172677    schedule 08.01.2014    source источник
comment
Можете ли вы опубликовать свой код?   -  person Bhushan    schedule 08.01.2014


Ответы (1)


Исключение, которое вы получаете, указывает на то, что что-то не так со структурой базового контейнера OLE2.

Старый POIFSFileSystem немного более придирчив, чем новый (но предназначенный только для чтения) NPOIFSFileSystem, когда дело доходит до структуры OLE2, поэтому вам, вероятно, следует попробовать переключиться на нее. Тогда ваш код установки будет таким:

NPOIFSFileSystem fs = new NPOIFSFileSystem(file);
HWPFDocument doc = new HWPFDocument(fs.getRoot());
WordExtractor docExtractor = new WordExtractor(doc);

В качестве бонуса NPOIFSFileSystem также немного быстрее и требует меньше памяти.

person Gagravarr    schedule 08.01.2014
comment
да, теперь это работает... можем ли мы также использовать NPOIFSFileSystem для XWPFDocument (для docx)? - person user3172677; 09.01.2014
comment
Нет, NPOIFS/POISF предназначены только для старых документов на основе OLE2, таких как .doc. Для файлов OOXML, таких как .docx, вам необходимо использовать OPCPackage в соответствии со всей документацией. - person Gagravarr; 09.01.2014