我正在尝试遍历一个 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;
}
}
最佳答案
对于嵌入(相对于外部)图像,最简单的方法是:
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,以及您的页眉/页 footer 分等)中根据需要搜索它们。
https://github.com/plutext/docx4j/blob/master/src/samples/docx4j/org/docx4j/samples/ImageConvertEmbeddedToLinked.java会给你一个关于如何做到这一点的提示。请注意,图像有两种不同的 XML 结构。较新的 DrawingML XML 和旧版 VML。
关于java - 如何在 DOCX4J 中保存 word 文档中的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26598730/