2014-10-27 92 views
4

我试图遍历Word文档并保存Word文档中找到的所有图像。我尝试了样品word文档上传到online demo,发现图像被列为:如何在DOCX4J中保存Word文档中的图像

/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

您关心图像的上下文(即顺序,周围文本)还是只想转储他们在哪里? – JasonPlutext 2014-10-28 00:14:45

+0

虽然这将是以后的良好信息......现在只需倾销它们就足够了。 – birdy 2014-10-28 02:35:48

+0

只需点击此链接(http://cnedelcu.blogspot.in/2013/02/top-3-ways-to-extract-images-from-word-docx-doc-document.html)可能对您有用 – yugi 2014-10-30 04:27:20

回答

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。

+0

伟大的作品!有没有办法不拉缩略图?这似乎也拉动缩略图。 – Anthony 2014-11-04 16:43:47

0

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

◾If它尚未.docx文件,在Word 2007中打开文件,将文件保存为Word文档(* .DOCX)。 ◾将原始文件的文件扩展名从.docx更改为.zip,如图D所示。

相关问题