6、docx4j中图片的使用(模板式)
docx4jadmin 发布于:2018-10-14 22:02:49
阅读:loading
前面一章节讲到的docx4j中使用图片的方式为编程式的方式,如果关于图片的就只有这么点未免也确实不够深入,本篇文章继续讲在docx4j总使用图片的方式,基于模板来使用,一般情况下某些需求的图片为固定图片,可以直接通过在模板中添加图片后即可,但既然是对于图片的cao作,我们就来实现一下对于读docx文件里面的图片,将其覆盖的实现,从而实现图片的动态插入(修改或替换)。
假设现在要在一个docx的模板文件中将一些个图片进行替换,可能有的方式为在模板文件中创建一个“标记”,然后循环文档中的这些特殊标记将其插入为图片即可,但我这里采取的方式为在模板中预先插入一个同等大小的图片,并且调整好样式,然后用程序将图片替换即可,至于图片的现有样式(布局、显示位置等)从模板中图片中获取。模板文件参考图如下:
在上图的同等大小的占位图处,含有图片的浮动方式、位置等参数,生成的新文件会将其替换掉,参考代码如下:
package cn.chendd.docx4j.examples;
import java.io.File;
import java.util.List;
import javax.xml.bind.JAXBElement;
import org.apache.commons.io.FileUtils;
import org.docx4j.Docx4J;
import org.docx4j.dml.CTNonVisualDrawingProps;
import org.docx4j.dml.wordprocessingDrawing.Anchor;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.Drawing;
public class ImageTemplateTest {
public static void main(String[] args) throws Exception {
String templatePath = System.getProperty("user.dir") + "/template/模板式图片_template.docx";
String outPath = System.getProperty("user.dir") + "/template/out/模板式图片.docx";
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File(templatePath));
MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
String xPath = "//w:drawing";
List<Object> list = documentPart.getJAXBNodesViaXPath(xPath, true);
@SuppressWarnings("unchecked")
JAXBElement<Drawing> element = (JAXBElement<Drawing>) list.get(0);
Drawing drawing = element.getValue();
//获取原图的相关信息,再取创建一个新的图片,用户替换原图
Anchor anchor = (Anchor) drawing.getAnchorOrInline().get(0);//当前的图片
Integer posH = anchor.getPositionH().getPosOffset();//原占位图的坐标位置
Integer posV = anchor.getPositionV().getPosOffset();
CTNonVisualDrawingProps docPr = anchor.getDocPr();
int xId = (int) docPr.getId();
String filenameHint = docPr.getName();
String altText = docPr.getDescr();
int yId = (int) anchor.getGraphic().getGraphicData().getPic().getNvPicPr().getCNvPr().getId();
String imagePath = ImageTest.class.getResource("/resources/images/badge.png").getPath();
byte bytes[] = FileUtils.readFileToByteArray(new File(imagePath));
BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);
Anchor inline = imagePart.createImageAnchor(filenameHint, altText, xId, yId, false, posH, posV);
drawing.getAnchorOrInline().set(0, inline);
System.out.println("--------图片已经替换--------");
Docx4J.save(wordMLPackage, new File(outPath));
}
}
参考运行效果图为:
生成结果附件下载:
点赞