2014-06-30 69 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; 
    } 
} 
相关问题