5、docx4j中图⽚的使⽤(编程式)
关于docx4j中如何使⽤图⽚,如果我不讲到在⽂档中使⽤图⽚,未免我所讲述的知识也太肤浅了吧,⾔归正传,我在这⾥给⽂档插⼊图⽚围绕编程式和模板式(我⾃⼰这么称的,就是想表达利⽤模板去实现的意思)的,并且重要的是插⼊图⽚的⽅式有也有两种最常⽤的“嵌⼊型”和“衬于⽂字下⽅”,我认为这两种才是经常被使⽤到的。
由于之前也是看到有同事在做word报表时,使⽤到了盖章的图⽚,这种盖章的图⽚就是将插⼊的图⽚设置“悬浮”的效果,浮动于⼀些⽂本之上,达到⼀种盖上去的效果。由于使⽤过这种效果,所以在研究如何插⼊图⽚并且可以实现衬于⽂字下⽅时的时候,这个问题没搞清楚也⼀直阻碍我往下进⾏的脚步。我也尝试着使⽤前⽂中的草稿的⽅式进⾏编程式的解决,后来没有⾏通,也查阅了许多资料,均⽆果,后来查看了⼀下docx4j提供的插⼊图⽚的源码,终于到了线索。。。。。在源码类BinaryPartAbstractImage.java中隐藏着真相(它⾥⾯提供的插⼊图⽚的实现,是采⽤xml模板的⽅式实现的),提供的插⼊图⽚为嵌⼊型的(函数为createImageInline),由于之前查看的浮动式图⽚的xml⽂本的属性标签为Anchor,就查看了⼀下这个图⽚处理类的源码,发现关于Anchor的⼏个⽅法都给注释掉了,于是将取消注释后,进⾏代码调⽤测试,后来⼜更改了代码中的⼏个位置,最终运⾏OK,图⽚也成为了我期待的效果,参考修改的代码截图为:
对于衬于⽂字下⽅和上⽅⽅式的具体设置参考如下图(通过新建⽂档后docx打开⽅式为解压缩⼯具后看到的),1和0分半是衬于⽂字下⽅和上⽅的参数设置:
关于本⽰例我将采⽤编程式的⽅式分半向新建的⽂档插⼊3张图⽚,其中前⾯两张图⽚分半为嵌⼊型的,第三张图⽚为浮动型的衬于⽂字下⽅,参考效果如下图所⽰:
参考代码为:
package cn.amples;
import java.io.File;
import org.apachemons.io.FileUtils;
import org.docx4j.dml.wordprocessingDrawing.Anchor;
import org.docx4j.dml.wordprocessingDrawing.Inline;
import org.docx4j.jaxb.Context;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;
import org.docx4j.wml.P;
import org.docx4j.wml.Text;
public class ImageTest {
public static void main(String[] args) throws Exception {
String imagePath = Resource("/resources/images/desktop.jpg").getPath();
File image = new File(imagePath);
WordprocessingMLPackage wordPackage = atePackage();
//插⼊图⽚1---图⽚格式为嵌⼊型
P p1 = newImageInline(wordPackage, adFileToByteArray(image), "111111111", "22222",            1001, 1002 , "这是图1,desktop.jsp,看图⽚的嵌⼊⽅式");
//插⼊图⽚2---图⽚格式为嵌⼊型
P p2 = newImageInline(wordPackage, adFileToByteArray(new ParentFile() ,
"name.png")), "", "" , 2001, 2002 , "这是图2,name.png,看图⽚的嵌⼊⽅式");
//插⼊图⽚3---图⽚格式为衬于⽂字下⽅图片下载站源码
P p3 = newImageAnchor(wordPackage, adFileToByteArray(new ParentFile() ,
"name.png")), "", "" , 2001, 2002 , "这是图3,name.png,看图⽚的嵌⼊⽅式");
String outPath = Property("user.dir") + "/template/out/编程式图⽚.docx";
wordPackage.save(new File(outPath));
}
/**
* 摘⾃github源码⽰例代码中的 ImageAdd.java
*/
public static org.docx4j.wml.P newImageInline(
WordprocessingMLPackage wordMLPackage, byte[] bytes,
String filenameHint, String altText, int id1, int id2 , String text)
throws Exception {
BinaryPartAbstractImage imagePart = ateImagePart(wordMLPackage,bytes);          Inline inline = ateImageInline(filenameHint, altText, id1, id2, false);
// Now add the inline in w:p/w:r/w:drawing
org.docx4j.wml.ObjectFactory factory = WmlObjectFactory();
org.docx4j.wml.P p = ateP();
org.docx4j.wml.R run = ateR();
if(text != null){
Text txt = ateText();
txt.setValue(text);
}
org.docx4j.wml.Drawing drawing = ateDrawing();
return p;
}
/**
* Create image, without specifying width
*/
public static org.docx4j.wml.P newImageAnchor( WordprocessingMLPackage wordMLPackage,
byte[] bytes,
String filenameHint, String altText,
int id1, int id2 , String text) throws Exception {
BinaryPartAbstractImage imagePart = ateImagePart(wordMLPackage,bytes);            Anchor inline = ateImageAnchor(filenameHint, altText, id1, id2, false, 100, 200);
// Now add the inline in w:p/w:r/w:drawing
org.docx4j.wml.ObjectFactory factory = WmlObjectFactory();
org.docx4j.wml.P  p = ateP();
org.docx4j.wml.R  run = ateR();
if(text != null){
Text txt = ateText();
txt.setValue(text);
}
org.docx4j.wml.Drawing drawing = ateDrawing();
return p;
}
}
附上上⾯讲到的修改源码的类的源码,修改后可字节放置在⾃⼰项⽬内,也可以将编译的class⽂件替换到jar包所在⽬录中, 相关下载为: 源码类修改
代码运⾏⽣成⽂件

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。