【问题标题】:How to read shapes group as an image from Word document(.doc or .docx) using apachePOI?如何使用 apachePOI 从 Word 文档(.doc 或 .docx)中读取形状组作为图像?
【发布时间】:2014-06-30 17:11:39
【问题描述】:

我有一个简单的要求来提取在 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();
    }
}

}

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

有人知道我该怎么做吗?

【问题讨论】:

  • 我想,你要找的东西是不可能的。

标签: java apache-poi hwpf xwpf


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您是指 Office Art 对象,那么

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 2015-03-13
      • 1970-01-01
      相关资源
      最近更新 更多