如何使用apachePOI从Word文档(.doc或.docx)中读取形状组作为图像?

时间:2014-06-30 17:11:40

标签: java apache-poi hwpf xwpf

我有一个简单的要求,即提取在MS Word文件中绘制的所有图像和图表。 我只能提取图像而不能提取形状组(如用例图或活动图)。我想将所有Diagrams保存为图像。

我使用过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();
    }
}

}

它只提取图像而不是形状。

有人知道我该怎么做?

2 个答案:

答案 0 :(得分:2)

所以你是在[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();

使用所有这些记录中的数据,您可以理论上再次渲染原始图形。但这很痛苦......

到目前为止,我只在一个案例中完成了这项工作,我在页面上有很多简单的箭头。那些必须转换为文本表示(类似于:&#34;位置(x1,y1)和(x2,y2)通过箭头&#34; )连接。这样做本质上意味着使用上述记录实现与这些箭头相关的[MS-ODRAW]的子集。这不是一项令人愉快的任务。

MS Word备份解决方案

如果使用MS Word本身是一个选项,那么还有另一种实用的方法:

  1. 使用POI提取包含OfficeDrawings的所有相关偏移量。
  2. 内部Word:使用VBA迭代文档并将给定偏移处的所有绘图复制到剪贴板。
  3. 使用其他一些应用程序(我选择Visio)将剪贴板内容转储为PNG。
  4. 步骤1中对图纸的必要检查非常简单(见下文)。其余的可以在Word中完全自动化。如果有人需要,我可以分享相应的VBA代码。

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

答案 1 :(得分:0)

如果您的意思是Office Art对象,那么

在类org.apache.poi.hwpf.HWPFDocument中 有一个_officeDrawingsMain包含办公室艺术品

点击此链接https://poi.apache.org/apidocs/org/apache/poi/hwpf/HWPFDocument.html