2013-11-27 54 views
0

我想找出docx,pptx等內容的大小。是否有任何可用於此目的的包?我搜索了一下,發現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中,屬性值可能爲true,1或on。 – JasonPlutext

+0

@JasonPlutext我想單獨找到文本內容的大小。 – Cool

+0

使用POI來提取文本,然後調用'textString.length()'? – Gagravarr

回答

0

好吧,這已被問很久以前,也沒有迴應這個問題。我沒有使用OPCPackage,因此我的答案不是基於此。

DOCX(以及PPTX和XSLX)文件都是具有特定結構的zip文件。 我們可以因此使用java.util.zip包,並列舉zip文件的條目並獲得ZIP條目XL爲XLSX文件和docx文件的大小。可能是一個更通用的方法是忽略以下頂層拉鍊條目,即拉鍊開頭的條目:

  1. docProps
  2. _rels
  3. [CONTENT_TYPES] .XML

的大小其餘的zip條目(不要忽略此zip條目中的任何文件夾)會告訴你正確的內容大小。 此方法也非常高效 - 您只能讀取zip文件的條目而不讀取zip文件,因此獲取大小信息的時間和內存資源可以忽略不計。爲了快速入門,我能夠在幾分之一秒內獲得4MB docx文件的大小。

下面粘貼了一個「足夠好」但沒有充分工作的代碼片段。請隨意將此作爲起點,並修復發現的錯誤。如果你可以發回修改或更正以便其他人能夠獲益,那將是非常好的

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"); 
} 
相關問題