当前位置: 首页 > 知识库问答 >
问题:

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

钱志强
2023-03-14

我的目标是使用ApachePOI在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"))

共有1个答案

凌翔宇
2023-03-14

所有可用的引擎都是名称空间感知引擎。因此必须声明名称空间。

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();
 }
}
 类似资料:
  • 问题内容: 我正在实现是否有位图,那么它应该将图像从imageview保存到内部存储器,否则在应用程序的内部存储器中设置另一个位图。这是代码:_ 问题答案: 您可以按以下方式检查它: 只需检查Bitmap值,如下所示:

  • 我在我的Java应用程序中使用Jackson JSON库及其Tree Model系统()。在这种情况下,我需要检查是否包含给定的。我正在浏览JavaDocs,并且没有看到的任何类型的方法。我最终自己写了一个包含方法: 单元测试: 我是否错过了杰克逊的一些东西,我正在复制一些我错过的图书馆方法。否则,还有比我做的更好的方法吗?

  • 问题内容: 给定一个整数,如何使用Java检查它是否包含0? 如何才能做到这一点? 问题答案: 您是说小数表示形式是否包含0?绝对 最简单的 方法是: 别忘了一个数字并不“固有地”包含一个0或不包含0(当然,零本身除外)-它取决于底数。因此,十进制的“ 10”是十六进制的“ A”,而十六进制的“ 10”是十进制的“ 16”……在两种情况下,结果都会改变。 在整数的十进制表示形式中,可能有更有效的方

  • 问题内容: 如何检查字符串是否包含\ n或换行符? 问题答案: 如果字符串是在同一程序中构造的,则建议使用以下命令: 但是,如果您指定使用\ n,则此驱动程序说明了如何做: 导致 回应您的评论: 结果是

  • 我正在寻找一个运算符,它允许我检查字段的值是否包含某个字符串。 比如: 可能吗?

  • 本文向大家介绍检查Java ArrayList是否包含给定项,包括了检查Java ArrayList是否包含给定项的使用技巧和注意事项,需要的朋友参考一下 java.util.ArrayList.contains()方法可用于检查Java ArrayList是否包含给定项。此方法具有单个参数,即测试了其在ArrayList中是否存在的项目。如果该项目在ArrayList中存在,则返回true;如果