2014-10-27 3 views
4

Я пытаюсь пройти через документ слова и сохранить все изображения, найденные в документе слова. Я пытался загрузить образец документ слова к online demo и заметил, что изображения в списке:Как сохранить изображения из документа Word в DOCX4J

/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

+0

Хотя это была бы хорошая информация, чтобы потом ... прямо сейчас просто сбрасывать их хватит. – birdy

+0

просто проверьте эту ссылку (http://cnedelcu.blogspot.in/2013/02/top-3-ways-to-extract-images-from-word-docx-doc-document.html) может быть вам полезна – yugi

ответ

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. Новый XML DrawingML и устаревший VML.

+0

Отлично! Есть ли способ не вытаскивать уменьшенное изображение? это, кажется, тянет и уменьшенное изображение. – Anthony

0

Чтобы получить доступ к встроенным изображениям в .docx файла, выполните следующие действия:

◾If это не уже .docx файла, откройте файл в Word 2007 и сохранить файл как документ Word (* .docx). ◾ Измените расширение файла в исходном файле с .docx на .zip, как показано на рисунке D.

Смежные вопросы