2014-06-30 72 views
6

我有一個簡單的要求來提取在MS Word文件中繪製的所有圖像和圖表。 我能夠僅提取圖像,但不提取圖形組(如用例圖或活動圖)。我想將所有的圖表保存爲圖像。如何使用apachePOI從Word文檔(.doc或.docx)中讀取形狀組?

我已經使用apachePOI。

下面的代碼我已經寫

public class worddocreader { 
public static void main(String args[]) { 
    FileInputStream fis; 
    try { 
     FileInputStream fs = new FileInputStream("F:/1.docx"); 
     XWPFDocument docx = new XWPFDocument(fs); 
     List<XWPFPictureData> piclist = docx.getAllPictures(); 
     Iterator<XWPFPictureData> iterator = piclist.iterator(); 
     int i = 0; 
     while (iterator.hasNext()) { 
      XWPFPictureData pic = iterator.next(); 
      byte[] bytepic = pic.getData(); 
      BufferedImage imag = ImageIO.read(new ByteArrayInputStream(
        bytepic)); 
      ImageIO.write(imag, "image/jpeg", new File("F:/docParsing/imagefromword" + i + ".jpg")); 
      i++; 
     } 

     ArrayList<PackagePart> packArrayList = docx.getPackageRelationship().getPackage().getParts(); 
     int size = packArrayList.size(); 
     System.out.println("Array List Size : " + packArrayList.size()); 

     while (size-->0) { 
      PackagePart packagePart = packArrayList.get(size); 

      System.out.println(packagePart.getContentType()); 

      try{ 
       BufferedImage bfrImage = ImageIO.read(packagePart.getInputStream()); 
       ImageIO.write(bfrImage,"image/png",new File("F:/docParsing_emb/size"+size+".png")); 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
     } 
     System.out.println("Done"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

}

只提取圖像形狀沒有。

有誰知道我該怎麼做?

+0

我想,你在找什麼是不可能的。 –

回答

1

一個_officeDrawingsMain那麼你是在[MS-ODRAW]中定義的東西之後,即所謂的OfficeDrawings,它可以使用其繪圖調色板直接在Word中創建?

不幸的是,POI在這裏提供的幫助不大。隨着HWPF(舊二進制* .doc文件格式),你可以得到一個處理這些數據,如下所示:

HWPFDocument document; 
OfficeDrawings officeDrawings = document.getOfficeDrawingsMain(); 
OfficeDrawing drawing = officeDrawings.getOfficeDrawingAt(OFFSET); 
// OFFSET is a global character offset describing the position of the drawing in question 
// i.e. document.getRange().getStartOffset() + x 

drawing然後可以進一步加工成單獨的記錄:

EscherRecordManager escherRecordManager = new EscherRecordManager(drawing.getOfficeArtSpContainer()); 
EscherSpRecord escherSpRecord = escherRecordManager.getSpRecord(); 
EscherOptRecord escherOptRecord = escherRecordManager.getOptRecord(); 

使用所有這些記錄中的數據,您可以理論上再次渲染原始繪圖。但它是相當痛苦的...

到目前爲止,我只在一個情況下做了這個,我有很多簡單的箭頭在頁面上浮動。那些必須被轉換爲文本表示(如:「位置(x1,y1)和(x2,y2)通過箭頭」「連接。這樣做基本上意味着使用上述記錄實現與這些箭頭相關的[MS-ODRAW]子集。不完全是一個愉快的任務。

MS Word的備份解決方案

如果使用的MS Word本身是一種選擇你,那麼還有另外一種務實的方式:

  1. 提取物,含有使用POI OfficeDrawings所有相關的偏移。
  2. 內部Word:使用VBA迭代文檔,並將給定偏移處的所有圖形複製到剪貼板。
  3. 使用其他應用程序(我選擇Visio)將剪貼板內容轉儲到PNG中。

在步驟1中對圖紙進行必要的檢查非常簡單(見下文)。其餘的可以在Word中完全自動化。如果有人需要,我可以分享各自的VBA代碼。

if (characterRun.isSpecialCharacter()) { 
    for (char currentChar : characterRun.text().toCharArray()) { 
     if ('\u0008' == currentChar) return true; 
    } 
} 
相關問題