poi在指定位置插入图片并浮动

简介: 在使用poi操作docx模板文件时,poi直接插入图片是插入内嵌图片 这个图片是占位置的。

缺陷:当有多张签名的时候需要计算位置,插入位置是从插入位置段落开始算起
代码:

import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.Document;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.xmlbeans.XmlException;
import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObject;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTAnchor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDrawing;
 
 
import java.io.*;
 
/**
 * created by ldl 2018/12/12
 */
public class Test3 {
    public static void main(String[] args) throws Exception {
        XWPFDocument document = new XWPFDocument();
        document.createParagraph().createRun().setText("测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试");
        XWPFParagraph paragraph = document.createParagraph();
        XWPFRun run = paragraph.createRun();
        // 设置图片
        run.setText("测试图片: ");
        // 添加浮动图片
        run = paragraph.createRun();
        InputStream in = new FileInputStream("C:\\Users\\hasee\\Desktop\\word\\下载.png");
        run.addPicture(in, Document.PICTURE_TYPE_PNG, "TEST", Units.toEMU(100), Units.toEMU(30));
        in.close();
        // 2. 获取到图片数据
        CTDrawing drawing = run.getCTR().getDrawingArray(0);
        CTGraphicalObject graphicalobject = drawing.getInlineArray(0).getGraphic();
 
        //拿到新插入的图片替换添加CTAnchor 设置浮动属性 删除inline属性
        CTAnchor anchor = getAnchorWithGraphic(graphicalobject, "TEST1",
                Units.toEMU(100), Units.toEMU(30),//图片大小
                Units.toEMU(50), Units.toEMU(0), false);//相对当前段落位置 需要计算段落已有内容的左偏移
        drawing.setAnchorArray(new CTAnchor[]{anchor});//添加浮动属性
        drawing.removeInline(0);//删除行内属性
        run.setText("测试测试测试测试试测试测试");
        document.write(new FileOutputStream("C:\\Users\\hasee\\Desktop\\word\\WordInsertPictures1.docx"));
        document.close();
    }
 
    /**
     * @param ctGraphicalObject 图片数据
     * @param deskFileName      图片描述
     * @param width             宽
     * @param height            高
     * @param leftOffset        水平偏移 left
     * @param topOffset         垂直偏移 top
     * @param behind            文字上方,文字下方
     * @return
     * @throws Exception
     */
    public static CTAnchor getAnchorWithGraphic(CTGraphicalObject ctGraphicalObject,
                                                String deskFileName, int width, int height,
                                                int leftOffset, int topOffset, boolean behind) {
        String anchorXML =
                "<wp:anchor xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" "
                        + "simplePos=\"0\" relativeHeight=\"0\" behindDoc=\"" + ((behind) ? 1 : 0) + "\" locked=\"0\" layoutInCell=\"1\" allowOverlap=\"1\">"
                        + "<wp:simplePos x=\"0\" y=\"0\"/>"
                        + "<wp:positionH relativeFrom=\"column\">"
                        + "<wp:posOffset>" + leftOffset + "</wp:posOffset>"
                        + "</wp:positionH>"
                        + "<wp:positionV relativeFrom=\"paragraph\">"
                        + "<wp:posOffset>" + topOffset + "</wp:posOffset>" +
                        "</wp:positionV>"
                        + "<wp:extent cx=\"" + width + "\" cy=\"" + height + "\"/>"
                        + "<wp:effectExtent l=\"0\" t=\"0\" r=\"0\" b=\"0\"/>"
                        + "<wp:wrapNone/>"
                        + "<wp:docPr id=\"1\" name=\"Drawing 0\" descr=\"" + deskFileName + "\"/><wp:cNvGraphicFramePr/>"
                        + "</wp:anchor>";
 
        CTDrawing drawing = null;
        try {
            drawing = CTDrawing.Factory.parse(anchorXML);
        } catch (XmlException e) {
            e.printStackTrace();
        }
        CTAnchor anchor = drawing.getAnchorArray(0);
        anchor.setGraphic(ctGraphicalObject);
        return anchor;
    }
}
目录
相关文章
|
5月前
【Typora】如何使用Markdown插入一段文字,部分左对齐,部分右对齐
如何在Markdown编辑器Typora中使用HTML语法实现同一行内文字的左对齐和右对齐布局。
370 1
element plus表格的表头和内容居中
element plus表格的表头和内容居中
551 0
|
8月前
|
开发工具
如何拖拽图片放到指定的格子里?
如何拖拽图片放到指定的格子里?
157 0
|
XML JSON Java
Java POI Word07版插入图片并指定浮动位置
由于工作需要,又接触到了POI操作Word,以往只是简单的读取操作,这次是写入操作;
1060 0
Java POI  Word07版插入图片并指定浮动位置
poi往word单元格插入图片,支持本地图片和网络图片
最近word导出时需要导出图片,在网上翻了会就发现了好心人分享的代码,但是只支持本地文件读取,我们项目需要从其他服务器获取图片,那肯定得使用网络方式了,于是在源代码上进行了完善,可接收本地和网络两种url方式。
655 1
|
开发工具
如何拖拽图片放到指定的格子里
嗨!大家好,我是小蚂蚁。 今天来分享一个如何在游戏中拖拽一个图片,然后把它放到指定的格子里,效果如下图: 这个基础的操作在很多的游戏中都有应用,例如棋类游戏,拖拽消除合成类游戏,或者是在背包装备栏等地方。总之,只要有这种格子类的布局,并且又需要拖拽放置操作,那么这个功能就会被需要。
225 0
poi 生成word 表格,并向表格单元格中插入多个图片
poi 生成word 表格,并向表格单元格中插入多个图片
482 0
poi 生成word 表格,并向表格单元格中插入多个图片
|
数据库
poi 读取word 遍历表格和单元格中的图片
poi 读取word 遍历表格和单元格中的图片
501 0
poi 读取word 遍历表格和单元格中的图片
如何在excel单元格中插入图片批注
在excel单元格中插入图片批注的方法: 1.选定要插入图片的单元格,然后右键选择插入批注。 2.然后会插入一个批注框,为了不影响图片效果,可以将批注文字都删除。然后鼠标移动到批注框边角再右键。 3.在右键菜单里选择设置批注格式,弹出批注格式设置对话框。
4008 0