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

时间:2014-10-27 23:47:02

标签: 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;
      }
   }

2 个答案:

答案 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所示。