6

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

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

}

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

有谁知道我该怎么做?

4

2 回答 2

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();

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

到目前为止,我只在一个页面上有很多简单的箭头浮动的情况下这样做了。这些必须转换为文本表示形式(例如:“位置 (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;
    }
}
于 2016-01-04T00:26:00.127 回答
0

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

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

检查此链接https://poi.apache.org/apidocs/org/apache/poi/hwpf/HWPFDocument.html

于 2014-10-18T06:39:24.910 回答