6、docx4j中图片的使用(模板式)

docx4j
placeholder image
admin 发布于:2018-10-14 22:02:49
阅读:loading

基本介绍

前面一章节讲到的docx4j中使用图片的方式为编程式的方式,如果关于图片的就只有这么点未免也确实不够深入,本篇文章继续讲在docx4j总使用图片的方式,基于模板来使用,一般情况下某些需求的图片为固定图片,可以直接通过在模板中添加图片后即可,但既然是对于图片的cao作,我们就来实现一下对于读docx文件里面的图片,将其覆盖的实现,从而实现图片的动态插入(修改或替换)。

假设现在要在一个docx的模板文件中将一些个图片进行替换,可能有的方式为在模板文件中创建一个“标记”,然后循环文档中的这些特殊标记将其插入为图片即可,但我这里采取的方式为在模板中预先插入一个同等大小的图片,并且调整好样式,然后用程序将图片替换即可,至于图片的现有样式(布局、显示位置等)从模板中图片中获取。模板文件参考图如下:

image.png

参考代码

在上图的同等大小的占位图处,含有图片的浮动方式、位置等参数,生成的新文件会将其替换掉,参考代码如下:

    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[] argsthrows 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(xPathtrue);

          @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 = (intdocPr.getId();

          String filenameHint = docPr.getName();

          String altText = docPr.getDescr();

          int yId = (intanchor.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(wordMLPackagebytes);

         

          Anchor inline = imagePart.createImageAnchor(filenameHintaltTextxIdyIdfalseposHposV);

          drawing.getAnchorOrInline().set(0, inline);

          System.out.println("--------图片已经替换--------");

         

          Docx4J.save(wordMLPackagenew File(outPath));

       }

      

    }

运行效果

参考运行效果图为:

image.png

生成结果附件下载:

模板式图片.docx


 点赞


 发表评论

当前回复:作者

 评论列表


留言区