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();
}
}
我的目标是使用 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();
}
}