Получение document.xml из файла docx с использованием ZipInputStream - PullRequest
3 голосов
/ 06 мая 2010

У меня есть inputStream файла docx, и мне нужно достать document.xml, который находится внутри docx.

Я использую ZipInputStream для чтения своего потока, и мой код похож на

    ZipInputStream docXFile = new ZipInputStream(fileName);
    ZipEntry zipEntry;
    while ((zipEntry = docXFile.getNextEntry()) != null) {
        if(zipEntry.getName().equals("word/document.xml"))
        {
            System.out.println(" --> zip Entry is "+zipEntry.getName());
        } 
    }

Как вы можете видеть, вывод для zipEntry.getName в какой-то момент приходит как "word / document.xml". Мне нужно передать этот document.xml в виде потока, и в отличие от метода ZipFile, где вы можете легко передать это при вызове .getInputStream, мне интересно, как я могу сделать этот docXFile?

Спасибо заранее, Минакши

@ Обновление: Я нашел выход для этого решения:

       ZipInputStream docXFile = new ZipInputStream(fileName);
    ZipEntry zipEntry;
    OutputStream out;

    while ((zipEntry = docXFile.getNextEntry()) != null) {
        if(zipEntry.toString().equals("word/document.xml"))
        {
            System.out.println(" --> zip Entry is "+zipEntry.getName());
            byte[] buffer = new byte[1024 * 4];
            long count = 0;
            int n = 0;
            long size = zipEntry.getSize();
            out = System.out;

            while (-1 != (n = docXFile.read(buffer)) && count < size) {
                out.write(buffer, 0, n);
               count += n;
            }
        }
    }

Мне интересно, есть ли какой-нибудь базовый API для преобразования этого потока вывода в поток ввода?

1 Ответ

2 голосов
/ 06 мая 2010

Примерно так должно работать (не проверено):

ZipFile zip = new ZipFile(filename)
Enumeration entries = zip.entries();
while ( entries.hasMoreElements()) {
   ZipEntry entry = (ZipEntry)entries.nextElement();

   if ( !entry.getName().equals("word/document.xml")) continue;

   InputStream in = zip.getInputStream(entry);
   handleWordDocument(in);
}

Кроме того, вы можете взглянуть на другую библиотеку zip, кроме встроенной. AFAIK встроенный не поддерживает все современные уровни сжатия / шифрования и другие вещи.

...