我正在尝试遍历word文档并保存word文档中的所有图像。我尝试将示例word文档上传到online demo,并注意到图片列为:
/word/media/image1.png rId5 image/png
/word/media/image2.png rId5 image/png
/word/media/image3.jpg rId5 image/jpeg
如何在遍历文档时以编程方式保存这些图像?
目前,我从文档中获取了所有文本:
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File(filePath))
MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart()
Document wmlDocumentEl = (org.docx4j.wml.Document)documentPart.getJaxbElement()
Body body = wmlDocumentEl.getBody();
DocumentTraverser traverser = new DocumentTraverser();
class DocumentTraverser extends TraversalUtil.CallbackImpl {
@Override
public List<Object> apply(Object o) {
if (o instanceof org.docx4j.wml.Text) {
....
}
return null;
}
}
答案 0 :(得分:1)
对于嵌入式(而非外部)图像,最简单的方法是:
import java.io.FileOutputStream;
import java.util.Map.Entry;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.Part;
import org.docx4j.openpackaging.parts.PartName;
import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPart;
import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;
public class SaveImages {
public static void main(String[] args) throws Exception {
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File(inputfilepath));
for (Entry<PartName, Part> entry : wordMLPackage.getParts().getParts().entrySet()) {
if (entry.getValue() instanceof BinaryPartAbstractImage) {
FileOutputStream fos = new FileOutputStream( yourfile ); // TODO: you can get file extension from PartName, or part class.
((BinaryPart)entry.getValue()).writeDataToOutputStream(fos);
fos.close();
}
}
}
}
如果您关心图像的上下文,则必须在相关部分中搜索它们(例如MainDocumentPart,以及页眉/页脚部分等)。
https://github.com/plutext/docx4j/blob/master/src/samples/docx4j/org/docx4j/samples/ImageConvertEmbeddedToLinked.java会给你提示如何做到这一点。请注意,图像有两种不同的XML结构。较新的DrawingML XML和传统的VML。
答案 1 :(得分:0)
要访问.docx文件中的嵌入图像,请使用以下步骤:
◾如果它不是.docx文件,请在Word 2007中打开该文件,并将该文件另存为Word文档(* .docx)。 ◾将原始文件的文件扩展名从.docx更改为.zip,如图D所示。