【问题标题】:How to save images from a word document in DOCX4J如何在 DOCX4J 中保存 word 文档中的图像
【发布时间】:2014-10-27 23:47:01
【问题描述】:

我正在尝试遍历 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;
      }
   }

【问题讨论】:

  • 您关心图像的上下文(即顺序、周围的文字),还是只想将它们转储到某个地方?
  • 虽然这将是稍后获得的好信息......现在只需倾倒它们就足够了。
  • 看看这个链接 (cnedelcu.blogspot.in/2013/02/…) 可能对你有用
  • 我希望以编程方式执行此操作。您建议的链接提到了手动执行此操作的方法。我相信有一种方法可以像@JasonPlutext 暗示的那样以编程方式做到这一点。
  • 检查 apache POI 是否有能力做到这一点。

标签: java docx docx4j


【解决方案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。

【讨论】:

  • 太棒了!有没有办法不拉缩略图?这似乎也拉出了缩略图。
【解决方案2】:

要访问 .docx 文件中的嵌入图像,请使用以下步骤:

◾如果还不是 .docx 文件,请在 Word 2007 中打开该文件并将该文件另存为 Word 文档 (*.docx)。 ◾将原文件的文件扩展名由.docx改为.zip,如图D所示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多