java - 如何在 DOCX4J 中保存 word 文档中的图像

标签 java docx docx4j

我正在尝试遍历一个 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/

相关文章:

ios - 禁用 UIWebView DiskImageCache

java - 如何获取pptx4j中slideLayout的名称?

Java-Web-Start 在我的应用程序中创建 docx 文件时出现 NoClassDefFoundError

java - 由于 StringIndexOutOfBoundsException,maven-javadoc-plugin 失败

java - 当 Body 不可分配给类时如何调试 JMS?

c# - 在 C# 中将 Html 转换为 Docx

java - 在java中将docx转换为pdf时出错

Java、Hibernate - 如何创建通用 getByColumnValue() 方法?

java - 背景资源边框顶部和底部

python - Django 创建.odt 或.docx 文件下载