Java实现在word中指定位置插入图片

 更新时间:2025年06月11日 08:59:10   作者:cccl.  
Poi-tl 是基于 Apache POI 的 Java 开源文档处理库,专注于高效操作 Word 文档,本文小编就来和大家详细讲讲Java如何使用Poi-tl实现在word中指定位置插入图片吧

Poi-tl 简介

Poi-tl 是基于 Apache POI 的 Java 开源文档处理库,专注于高效操作 Word 文档(.docx 格式)。它通过模板引擎机制简化复杂文档生成流程,相比原生 POI 具备更简洁的 API、更强的灵活性和更优的性能表现,广泛应用于报表生成、合同模板填充、文档批量处理等企业级场景。

Maven 依赖配置

<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.12.0</version>
</dependency>

Poi-tl 实现原理与步骤

1. 模板标签规范

在 Word 模板中需使用特定格式的占位符标识图片插入位置,标准格式为:{{@标签名称}}。

示例标签格式:

{{@Head}}  <!-- 审核人签名位置 -->
{{@Approver}}  <!-- 批准人签名位置 -->

2.完整实现代码

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.PictureType;
import com.deepoove.poi.data.Pictures;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.HashMap;
import java.util.Map;

/**
 * Word文档图片插入工具类
 * 功能:通过Poi-tl在Word模板指定位置插入图片
 */
public class WordImageInserter {

    /**
     * 主方法:执行Word图片插入操作
     */
    public static void main(String[] args) {
        Path templatePath = Path.of("D:\\template.docx");        // 源文档模板路径
        Path outputPath= Path.of("D:\\template_temp.docx"); // 新文件路径
        Path inspectorImagePath = Path.of("D:\\signatures\\inspector.png"); // 审核人签名图片
        Path approverImagePath = Path.of("D:\\signatures\\approver.png");   // 批准人签名图片

        try {
            // 绑定模板占位符与图片渲染对象
            Map<String, Object> dataModel = new HashMap<>();
            dataModel.put("Head", createPicture(inspectorImagePath, 100, 50));     // 替换{{@Head}}标签
            dataModel.put("Approver", createPicture(approverImagePath, 100, 50)); // 替换{{@Approver}}标签

            // 执行文档渲染与图片插入
            try (InputStream templateStream = Files.newInputStream(templatePath);
                 OutputStream tempOutputStream = Files.newOutputStream(tempOutputPath)) {

                // 编译模板并渲染数据
                XWPFTemplate template = XWPFTemplate.compile(templateStream).render(dataModel);
                
                // 输出到临时文件(避免直接修改原文件导致损坏)
                template.write(tempOutputStream);
                template.close();
            }

            // 原子性替换原文件(保证操作完整性)
            Files.move(tempOutputPath, templatePath, StandardCopyOption.REPLACE_EXISTING);
            System.out.println("图片插入操作完成,文档已更新");

        } catch (IOException e) {
            System.err.println("文档处理异常:" + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 构建图片渲染对象(支持尺寸自定义)
     * @param imagePath 图片文件路径
     * @param width 图片宽度(像素)
     * @param height 图片高度(像素)
     * @return 图片渲染对象(可直接用于模板渲染)
     * @throws IOException 图片读取失败时抛出
     */
    private static Object createPicture(Path imagePath, int width, int height) throws IOException {
        // 使用NIO流加载图片,自动识别图片类型(此处显式指定为PNG)
        return Pictures.ofStream(Files.newInputStream(imagePath), PictureType.PNG)
                .size(width, height)  // 自定义图片尺寸
                .create();           // 生成图片渲染实体
    }
}

3.效果展示

到此这篇关于Java实现在word中指定位置插入图片的文章就介绍到这了,更多相关Java word插入图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java使用kafka发送和生产消息的示例

    Java使用kafka发送和生产消息的示例

    本篇文章主要介绍了Java使用kafka发送和生产消息的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • SpringBoot使用easy-captcha 实现验证码登录功能(解决思路)

    SpringBoot使用easy-captcha 实现验证码登录功能(解决思路)

    文章介绍了如何使用Spring Boot和Easy-Captcha实现验证码登录功能,后端通过Easy-Captcha生成验证码并存储在Redis中,前端获取验证码并显示给用户,登录时,前端将用户输入的验证码和标识符发送到后端进行验证,感兴趣的朋友跟随小编一起看看吧
    2025-02-02
  • java分布式缓存方案

    java分布式缓存方案

    本文简单介绍了缓存的种类,缓存常见的问题,对大家的学习和工作有一定的参考价值,需要的小伙伴可以参考一下
    2021-08-08
  • SWT(JFace) 体验之FontRegistry

    SWT(JFace) 体验之FontRegistry

    测试代码如下:
    2009-06-06
  • Java中成员方法与成员变量访问权限详解

    Java中成员方法与成员变量访问权限详解

    在Java学习过程中,在写类经常为用到public,private和protected,我个人的经验是一般类的成员变量都是用private,方法用public,类的内部用protected方法,如果是存在子类的,那我就会把父类中的成员变量变为protected。(其余的看具体实际情 况而定)
    2015-08-08
  • Springmvc nginx实现动静分离过程详解

    Springmvc nginx实现动静分离过程详解

    这篇文章主要介绍了Springmvc nginx实现动静分离过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 一文弄懂Mybatis中介者模式

    一文弄懂Mybatis中介者模式

    本文主要介绍了一文弄懂Mybatis中介者模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • @RequestParam 参数偶尔丢失的解决

    @RequestParam 参数偶尔丢失的解决

    这篇文章主要介绍了@RequestParam 参数偶尔丢失的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • MyBatis核心配置文件深入分析

    MyBatis核心配置文件深入分析

    这篇文章主要介绍了MyBatis核心配置文件,MyBatis的前身就是iBatis,iBatis本是由Clinton Begin开发,后来捐给Apache基金会,成立了iBatis开源项目。2010年5月该项目由Apahce基金会迁移到了Google Code,并且改名为MyBatis
    2022-12-12
  • macbook中springboot的jmeter压测示例

    macbook中springboot的jmeter压测示例

    这篇文章主要介绍了macbook中springboot的jmeter压测示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11

最新评论