2 zkqloveyu1314 zkqloveyu1314 于 2016.05.12 17:24 提问

docx4j 向word插入图片,有大神懂docx4j的吗,求指导。

package com.cnas.cultivate.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import org.docx4j.dml.wordprocessingDrawing.Inline;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;
import org.docx4j.wml.ObjectFactory;
import org.docx4j.wml.P;
import org.docx4j.wml.R;
import org.docx4j.wml.Drawing;

public class Test1 {

  /**  像往常一样, 我们创建了一个包(package)来容纳文档. 
  *  然后我们创建了一个指向将要添加到文档的图片的文件对象.为了能够对图片做一些操作, 我们将它转换 
  *  为字节数组. 最后我们将图片添加到包中并保存这个包(package). 
  */  

 @SuppressWarnings("static-access")
public static void main (String[] args) throws Exception {  

// WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();

File fileDoc = new File("d:\a.docx");
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
wordMLPackage.load(fileDoc);
// WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage
// .load(fileDoc);

     File file = new File("d:\\a.png");  
     byte[] bytes = convertImageToByteArray(file);  
     addImageToPackage(wordMLPackage, bytes);  

     wordMLPackage.save(fileDoc);  

 }  



 /** 
  *  Docx4j拥有一个由字节数组创建图片部件的工具方法, 随后将其添加到给定的包中. 为了能将图片添加 
  *  到一个段落中, 我们需要将图片转换成内联对象. 这也有一个方法, 方法需要文件名提示, 替换文本,  
  *  两个id标识符和一个是嵌入还是链接到的指示作为参数. 
  *  一个id用于文档中绘图对象不可见的属性, 另一个id用于图片本身不可见的绘制属性. 最后我们将内联 
  *  对象添加到段落中并将段落添加到包的主文档部件. 
  *  @param wordMLPackage 要添加图片的包 
  *  @param bytes         图片对应的字节数组 
  *  @throws Exception    不幸的createImageInline方法抛出一个异常(没有更多具体的异常类型) 

  */  

 private static void addImageToPackage(WordprocessingMLPackage wordMLPackage,  

                         byte[] bytes) throws Exception {  

     BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);  



     int docPrId = 1;  

     int cNvPrId = 2;  

     Inline inline = imagePart.createImageInline("Filename hint","Alternative text", docPrId, cNvPrId, false);  

     P paragraph = addInlineImageToParagraph(inline);  

     wordMLPackage.getMainDocumentPart().addObject(paragraph);  



 }  



 /** 

  *  创建一个对象工厂并用它创建一个段落和一个可运行块R. 

  *  然后将可运行块添加到段落中. 接下来创建一个图画并将其添加到可运行块R中. 最后我们将内联 

  *  对象添加到图画中并返回段落对象. 

  * 

  * @param   inline 包含图片的内联对象. 

  * @return  包含图片的段落 

  */  

 private static P addInlineImageToParagraph(Inline inline) {  

     // 添加内联对象到一个段落中  

     ObjectFactory factory = new ObjectFactory();  

     P paragraph = factory.createP();  

     R run = factory.createR();  

     paragraph.getContent().add(run);  

     Drawing drawing = factory.createDrawing();  

     run.getContent().add(drawing);  

     drawing.getAnchorOrInline().add(inline);  

     return paragraph;  

 }  



 /** 

  * 将图片从文件对象转换成字节数组. 

  *  

  * @param file  将要转换的文件 

  * @return      包含图片字节数据的字节数组 

  * @throws FileNotFoundException 

  * @throws IOException 

  */  

 private static byte[] convertImageToByteArray(File file)  

         throws FileNotFoundException, IOException {  

     InputStream is = new FileInputStream(file );  

     long length = file.length();  

     // 不能使用long类型创建数组, 需要用int类型.  

     if (length > Integer.MAX_VALUE) {  

         System.out.println("File too large!!");  

     }  

     byte[] bytes = new byte[(int)length];  

     int offset = 0;  

     int numRead = 0;  

     while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {  

         offset += numRead;  

     }  

     // 确认所有的字节都没读取  

     if (offset < bytes.length) {  

         System.out.println("Could not completely read file " +file.getName());  

     }  

     is.close();  

     return bytes;  

 }  

}

3个回答

silehaixianghuirenj
silehaixianghuirenj   2016.10.08 01:17

eInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import org.docx4j.dml.wordprocessingDrawing.Inline;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;
import org.docx4j.wml.ObjectFactory;
import org.docx4j.wml.P;
import org.docx4j.wml.R;
import org.docx4j.wml.Drawing;
public class Test1 {
/** 像往常一样, 我们创建了一个包(package)来容纳文档.

  • 然后我们创建了一个指向将要添加到文档的图片的文件对象.为了能够对图片做一些操作, 我们将它转换
  • 为字节数组. 最后我们将图片添加到包中并保存这个包
aa80303857
aa80303857   2017.11.24 13:27
tlfu_12344
tlfu_12344   2018.06.27 11:35
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
java在word(*.docx)指定地点插入图片
最近因为一个项目需要在已经存在的word模板的指定地点插入图片,而且项目采用的是java,然而我对Java并不太熟,网上的资料大多是在生成模板的时候添加图片,我折腾了挺久才解决这个问题,在此记录下来。微软在MS Office 2007之后开始推出了.docx格式的word文档,推行ooxml(office open xml),也就是结合zip技术和xml技术来存储word文档。对docx文档进行操作
利用docx4j向docx文件中指定书签位置添加图片,包含相关jar包和demo
代码很短,但是找jar包找的欲仙欲死,包括commons-io-1.4.jar,commons-logging-1.1.1.jar,docx4j-3.3.3.jar,freemarker.jar,google-collections.jar,log4j-1.2.8.jar,slf4j-api-1.7.12.jar,slf4j-log4j12-1.7.12.jar,xalan-2.7.0.jar,xmlgraphics-commons-1.3.jar
Docx4j 简单操作文字图片(包含页眉页脚和主体内容)
docx4j官方提供了一些例子,本文只是其中一部分应用的简单例子。需要注意的地方是页眉和页脚,必须创建对应关系才能起作用。页眉和页脚添加图片的时候,第二个参数sourcePart是必须的,调用的createImagePart方法会创建图片的对应关系,否则就会出现看不到图片的情况。基本上掌握了图片和页眉页脚后,其他的都没什么难的,更多的用法可以参考官方的例子。下面是完整代码例子,具体说明看注释:imp
DocX类操作WORD文档——把图片插入到书签指定位置
此程序主要展示了如何把图片插入事先设定好的书签位置之中。 下载之后可以直接运行。
docx4j -- 使用Java处理word2007(.docx)文档
前面的话 最近的项目中很多地方需要处理Microsoft的word2007文档(即.docx文档),本来打算用Apache的POI项目,但经过试用发现其对word2007的支持并不好(其实可以说很差),网络上大家也都在讨论这个问题,说POI其实只是个半成品(仅仅是针对office2007这一块来说),并不推荐使用。 所以我又多方查找解决方案,最终找到了docx4j项目,docx4j主要用于
docx4j-操作word常用方法
import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.StringWriter; import java.math.BigInteger; import java.util.ArrayList; import java.util.List;
利用docx4j完美导出word文档(标签替换、插入图片、生成表格)
最近公司让我实现一个利用原有word模板,导出word文档的功能模块,发现docx4j是个很不错的工具,但是之前从来没有用过,对此并不了解,于是上网查找相关资料,也是非常少之,于是便自己开始摸索。1、原有word模板内容如下:2、在想要插入数据的地方,插入书签,之后会在代码中获取书签并遍历插入内容。3、直接上代码。(1)首先我将word模板文件路径配置在config.properties文件中so...
java docx4J向word插入内容
根据word模板
java docx4j 工具和xdocreport工具创建PDF或者word报表
首先创建一个maven工程 在pom文件中配置依赖 fr.opensagres.xdocreport fr.opensagres.xdocreport.converter.docx.xwpf 1.0.6 fr.opensagres.xdocreport org.apache.poi.xwpf.converter.pdf 1.0.6
freemarker+docx4j 生产自定义word
freemaker docx4j 生产word文档