2013-11-27 2 views
0

Я хочу узнать размер содержимого внутри docx, pptx и т. Д. Есть ли какой-либо пакет, который можно использовать для этого? Я googled и обнаружил, что POI широко используется для чтения/записи в типы файлов MS. Но не удалось найти правильный api, чтобы найти размер содержимого файла. Я хочу знать фактический размер содержимого, а не размер сжатого файла, который можно увидеть из свойств.найти размер содержимого файла docx, pptx и т. Д.

Наконец-то я нашел способ, но он бросает исключение OOM, если файл слишком велик.

OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath()); 
XWPFDocument doc = new XWPFDocument(opcPackage); 
XWPFWordExtractor we = new XWPFWordExtractor(doc); 
String paragraphs = we.getText(); 
System.out.println("Total Paragraphs: "+paragraphs.length()/1024); 

Пожалуйста, помогите мне, если есть другой лучший способ сделать это.

+1

Итак, сумма длин каждой части пакета? В случае частей XML вы хотите, чтобы длина включала имена элементов, например w: p, или просто содержимое текстовых узлов? Обратите внимание, что длина XML-документа может варьироваться в зависимости от того, какие префиксы пространства имен используются, где объявляются пространства имен. Также в Open XML значение атрибута может быть истинным, 1 или включенным. – JasonPlutext

+0

@JasonPlutext Я хочу найти размер текстового содержимого. – Cool

+0

Использовать POI для извлечения текста, а затем вызвать 'textString.length()' на нем? – Gagravarr

ответ

0

Хорошо, это было задано давно, и на этот вопрос также нет ответа. Я не использовал OPCPackage, и поэтому мой ответ не основан на этом.

DOCX (и в этом случае PPTX, а также XSLX) - все файлы zip, имеющие определенную структуру. Мы можем, следовательно, использовать java.util.zip пакет и перечислить записи файла почтового индекса и получить размер записи почтового х для XLSX файла и слова для DOCX файлов. Вероятно, более общий метод будет игнорировать следующие записи почтового индекса верхнего уровня, то есть записи почтового индекса, начиная с:

  1. docProps
  2. _rels
  3. [Content_Types] .xml

имеют размер оставшаяся запись zip (не игнорируйте ни одну папку в этой записи zip) сообщит вам правильный размер содержимого. Этот метод также очень эффективен - вы только читаете записи zip-файла, а не файл zip, поэтому получение информации о размере будет выполняться с незначительными ресурсами времени и памяти. Для быстрого запуска я смог получить размер файла docx размером 4 МБ за долю секунды.

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

private static final void printUnzippedContentLength() throws IOException 
    { 
      ZipFile zf = new ZipFile(new File("/home/chaitra/verybigfile.docx")); 

      Enumeration<? extends ZipEntry> entries = zf.entries(); 

      long sumBytes = 0L; 
      while(entries.hasMoreElements()) 
      { 
       ZipEntry ze = entries.nextElement(); 

       if(ze.getName().startsWith("docProps") || ze.getName().startsWith("_rels") || ze.getName().startsWith("[Content_Types].xml")) 
       { 
        continue; 
       } 
       sumBytes += ze.getSize(); 


      } 

      System.out.println("Uncompressed content has size " + (sumBytes/1024) + " KB"); 
} 
Смежные вопросы