首页 > 解决方案 > 使用 Apache POI 遍历 MS Word docx 并识别表格、图像和其他元素的序列

问题描述

我正在尝试使用 Apache POI 遍历 docx 文件,请参见以下代码

         FileInputStream fis = new FileInputStream("sample1.docx");
         XWPFDocument xdoc=new XWPFDocument(OPCPackage.open(fis));
         Iterator<IBodyElement> iter = xdoc.getBodyElementsIterator();
         int count=0;
         while(iter.hasNext()) {
             IBodyElement element=iter.next();
             if(element instanceof XWPFParagraph) {
                 System.out.println("Paragraph\t");
             }
             if(element instanceof XWPFPictureData) { // if(element instanceof XWPFPicture) { 
                 System.out.println("Picture");
             }if(element instanceof XWPFTable) {
                 System.out.println("Table");
             }
             count++;
         }
         System.out.println("Items Found " + count);

以下是我使用的输入 docx

在此处输入图像描述

我的结果是:

段落
段落
段落
段落 表 段落 段落 段落 找到
的 项目 9



问题是

我无法检索图片的位置,但仍然能够设法获取给定示例文件中表格的位置。(element instanceof XWPFPitureData) 或 (element instanceof XWPFPiture) 这两者都没有让我到达那里。不知何故,我的错误是我没有为我认为的图片使用正确的类型,那么我必须使用哪种类型来获取图片位置。提前致谢

标签: javaimageapachems-wordapache-poi

解决方案


我找到了以下代码的解决方案

         FileInputStream fis = new FileInputStream("sample1.docx");
         XWPFDocument xdoc=new XWPFDocument(OPCPackage.open(fis));
         List<XWPFParagraph> paragraphs=xdoc.getParagraphs();
         for(XWPFParagraph para : paragraphs) {         
             for(XWPFRun run : para.getRuns()) {
                 System.out.println(run.getEmbeddedPictures().size());
             }
         }

上面的代码返回段落中的图像数量。实际上,在 XML 编码中,XWPFPiture 本身是在 XWPFParagraph 中编码的,而在这种情况下,表格不是。所以我们需要这种间接方法来查找段落是否包含图像,通过这样做我们能够识别段落是否包含图片/图像并识别图片的位置或找到图片的段落。


推荐阅读