Apache POI XWPF - 检查 运行 是否包含图片

Apache POI XWPF - Check if a run contains a picture

我的目标是使用 Apache POI 在 Java 中处理 .docx 文档。我想从文档中提取所有内容以创建一个新文档,但只能包含我可以从已处理文档中选择的特定内容。 到目前为止,这对表格和文本有效,但我有一个关于图片的问题。通常我会像这样提取它们:

List<XWPFPictureData> images = r.getEmbeddedPictures();

其中r是从一个段落中提取出来的,类型是XWPFRun。 这里的一个大问题是,这个解决方案只适用于某些图像,这取决于图像在 word 文档中的插入方式。

我可以访问 运行 的 xml 代码,并试图找到像这样的图像,它在 python 中运行良好,您可以在其中声明 xpath 查询。 我在 Java 中尝试了同样的方法,但收到一条错误消息。

这是我用来检查 运行 是否包含图像的代码:

r.getCTR().selectPath(".//w:drawing/wp:inline/a:graphic/a:graphicData/pic:pic/pic:blipFill/a:blip/@r:embed"))

它 returns 这个异常:

所有可用引擎都是命名空间感知引擎。所以必须声明命名空间。

import java.io.FileInputStream;

import org.apache.poi.xwpf.usermodel.*;

import org.apache.xmlbeans.XmlObject;

public class WordRunSelectPath {

 public static void main(String[] args) throws Exception {

  XWPFDocument document = new XWPFDocument(new FileInputStream("WordInsertPictures.docx"));
  for (XWPFParagraph paragraph : document.getParagraphs()) {
   for (XWPFRun run : paragraph.getRuns()) {
    String declareNameSpaces =   "declare namespace w='http://schemas.openxmlformats.org/wordprocessingml/2006/main'; " 
                       + "declare namespace wp='http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing'; "
                       + "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main'; "
                       + "declare namespace pic='http://schemas.openxmlformats.org/drawingml/2006/picture'; "
                       + "declare namespace r='http://schemas.openxmlformats.org/officeDocument/2006/relationships' ";

    XmlObject[] selectedObjects = run.getCTR().selectPath(
                         declareNameSpaces 
                       + ".//w:drawing/wp:inline/a:graphic/a:graphicData/pic:pic/pic:blipFill/a:blip/@r:embed");
    if (selectedObjects.length > 0) {
     String rID = selectedObjects[0].newCursor().getTextValue();
     System.out.println(rID);
    }
   }
  }

  document.close();
 }
}