当前位置: 首页 > news >正文

java实现将图片插入word文档

插入图片所用依赖

 private static void insertImage(XWPFDocument document, String path) {List<XWPFParagraph> paragraphs = document.getParagraphs();for (XWPFParagraph paragraph : paragraphs) {CTP ctp = paragraph.getCTP();for (int dwI = 0; dwI < ctp.sizeOfBookmarkStartArray(); dwI++) {try {CTBookmark bookmark = ctp.getBookmarkStartArray(dwI);if (!"celue".equalsIgnoreCase(bookmark.getName())) continue;FileInputStream fis = new FileInputStream(new File(path));XWPFRun run = paragraph.createRun();//bus.png为鼠标在word里选择图片时,图片显示的名字,宽度,高度100,100则为像素单元,根据实际需要的大小进行调整即可。run.addPicture(fis, XWPFDocument.PICTURE_TYPE_JPEG, "target1.jpg", Units.toEMU(400), Units.toEMU(500));} catch (InvalidFormatException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (org.apache.poi.openxml4j.exceptions.InvalidFormatException e) {throw new RuntimeException(e);}}}}

上面代码中XWPFDocument documen 用到的依赖在下方

        <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version></dependency>

下面代码对应的依赖在下方 

XWPFRun run = paragraph.createRun();//bus.png为鼠标在word里选择图片时,图片显示的名字,宽度,高度100,100则为像素单元,根据实际需要的大小进行调整即可。run.addPicture(fis, XWPFDocument.PICTURE_TYPE_JPEG, "target1.jpg", Units.toEMU(400), Units.toEMU(500));

        <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.15</version></dependency>

剪裁图片所用依赖

 public static void main(String[] args) throws IOException {String wordPath = "D:\\work\\project\\jar\\wordtopdf-server\\wordtopdfByjdk16\\src\\main\\resources\\target1.docx";String destPath = "D:\\work\\project\\jar\\wordtopdf-server\\wordtopdfByjdk16\\src\\main\\resources\\targetA.docx";String picturePath = convertSuffix(wordPath, ".png");wordToImage(wordPath,"png");FileInputStream fis = new FileInputStream(new File(wordPath));XWPFDocument document = new XWPFDocument(new FileInputStream(new File(wordPath)));insertImage(document, picturePath);}private static void insertImage(XWPFDocument document, String path) {List<XWPFParagraph> paragraphs = document.getParagraphs();for (XWPFParagraph paragraph : paragraphs) {CTP ctp = paragraph.getCTP();for (int dwI = 0; dwI < ctp.sizeOfBookmarkStartArray(); dwI++) {try {CTBookmark bookmark = ctp.getBookmarkStartArray(dwI);if (!"celue".equalsIgnoreCase(bookmark.getName())) continue;FileInputStream fis = new FileInputStream(new File(path));XWPFRun run = paragraph.createRun();//bus.png为鼠标在word里选择图片时,图片显示的名字,宽度,高度100,100则为像素单元,根据实际需要的大小进行调整即可。run.addPicture(fis, XWPFDocument.PICTURE_TYPE_JPEG, "target1.jpg", Units.toEMU(400), Units.toEMU(500));} catch (InvalidFormatException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (org.apache.poi.openxml4j.exceptions.InvalidFormatException e) {throw new RuntimeException(e);}}}}

下面是剪裁图片的测试代码,目前剪完后,图片不对,可能是像素点设置的有问题

    public static void main(String[] args) throws IOException {String picturePath = "D:\\work\\project\\jar\\wordtopdf-server\\wordtopdfByjdk16\\src\\main\\resources\\targetA..png";BufferedImage bufferedImage = new BufferedImage(793, 1122, BufferedImage.TYPE_INT_RGB);BufferedImage coverImage = ImageUtils.getCoverImage(bufferedImage);File outputfile  = new File(picturePath);ImageIO.write(coverImage, "png", outputfile);}
package com.hx.utils;import lombok.extern.slf4j.Slf4j;import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;@Slf4j
public class ImageUtils {/*** bufferedImage转InputStream*/public static InputStream bufferedImageToInputStream(BufferedImage image) {ByteArrayOutputStream os = new ByteArrayOutputStream();try {ImageIO.write(image, "png", os);InputStream input = new ByteArrayInputStream(os.toByteArray());return input;} catch (IOException e) {}return null;}/*** 获取图片大小信息*/public static Rectangle getImgRect(BufferedImage image) throws IOException {Iterator readers = ImageIO.getImageReadersByFormatName("png");ImageReader reader = (ImageReader) readers.next();InputStream source = bufferedImageToInputStream(image);ImageInputStream iis = ImageIO.createImageInputStream(source);reader.setInput(iis, true);int imageIndex = 0;return new Rectangle(0, 0, reader.getWidth(imageIndex), reader.getHeight(imageIndex));}/*** 图片裁剪,按指定大小裁剪*/public static BufferedImage imageCut(BufferedImage image, Rectangle rect) throws IOException {// 取得图片读入器Iterator readers = ImageIO.getImageReadersByFormatName("png");System.out.println(readers);ImageReader reader = (ImageReader) readers.next();System.out.println(reader);// 取得图片读入流InputStream source = bufferedImageToInputStream(image);ImageInputStream iis = ImageIO.createImageInputStream(source);reader.setInput(iis, true);// 图片参数ImageReadParam param = reader.getDefaultReadParam();int imageIndex = 0;//Rectangle rect = new Rectangle(0, 0, reader.getWidth(imageIndex), 100);param.setSourceRegion(rect);BufferedImage bi = reader.read(0, param);iis.close();source.close();return bi;}/*** 压缩图片,用于高质量图片质量降低,改变图片大小*/public static BufferedImage compressImage(BufferedImage imageByte, int ppi) {BufferedImage smallImage = null;int width = 0, height = 0;if (imageByte == null)return null;InputStream byteInput = bufferedImageToInputStream(imageByte);try {Image image = ImageIO.read(byteInput);int w = image.getWidth(null);int h = image.getHeight(null);// adjust weight and height to avoid image distortiondouble scale = 0;scale = Math.min((float) ppi / w, (float) ppi / h);width = (int) (w * scale);width -= width % 4;height = (int) (h * scale);if (scale >= (double) 1)return imageByte;BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);buffImg.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);//ByteArrayOutputStream out = new ByteArrayOutputStream();//ImageIO.write(buffImg, "png", out);smallImage = buffImg;} catch (IOException e) {e.printStackTrace();}return smallImage;}/*** 将BufferedImage转换为byte[]* @param image* @return*/public static byte[] bufferedImageToByteArray(BufferedImage image) throws IOException{ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(image, "png", os);return os.toByteArray();}/*    *//*** 将BufferedImage转换pdf*//*public static String imageToPdf(List<BufferedImage> images) throws IOException {log.info("图片转pdf开始===============");String newFile = StrUtil.uuid().replace("-", "") + ".pdf";PdfWriter pdfWriter = new PdfWriter( newFile);PdfDocument pdfDocument = new PdfDocument(pdfWriter);Document document = new Document(pdfDocument);for (BufferedImage image : images) {byte[] data = bufferedImageToByteArray(image);com.itextpdf.layout.element.Image img = new com.itextpdf.layout.element.Image(ImageDataFactory.createPng(data));document.add(img);}document.close();log.info("图片转pdf结束===============");return newFile;}*//*** 获取缩略图图片,用作封面,按长宽比例设备,高度太高裁掉,高度太低补余白*/public static BufferedImage getCoverImage (BufferedImage originalImage) throws IOException {BufferedImage result = null;// 获取图片的长宽int originalWidth = originalImage.getWidth();int originalHeight = originalImage.getHeight();Rectangle rect = ImageUtils.getImgRect(originalImage);if (rect.getHeight() > rect.getWidth()) {rect.setRect(0,0, rect.getWidth(), rect.getWidth() / 1.3);result = ImageUtils.imageCut(originalImage, rect);} else {int newWidth = 800;int newHeight = 600;// 计算缩放比例double scale = Math.min((double) newWidth / originalWidth, (double) newHeight / originalHeight);// 计算调整后的长宽int scaledWidth = (int) (originalWidth * scale);int scaledHeight = (int) (originalHeight * scale);// 创建新的BufferedImage对象,添加余白BufferedImage resizedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);Graphics2D g = resizedImage.createGraphics();Color fillColor = new Color(255, 255, 255); // 白颜色g.setColor(fillColor);g.fillRect(0, 0, newWidth, newHeight);g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);g.dispose();result = resizedImage;}return result;}}

相关文章:

java实现将图片插入word文档

插入图片所用依赖 private static void insertImage(XWPFDocument document, String path) {List<XWPFParagraph> paragraphs document.getParagraphs();for (XWPFParagraph paragraph : paragraphs) {CTP ctp paragraph.getCTP();for (int dwI 0; dwI < ctp.sizeO…...

初识java(3)

大家好&#xff0c;今天我们来讲讲我们的老伙计-变量&#xff0c;在哪一门编程语言中&#xff0c;变量的作用都是不可或缺的&#xff0c;那么下面我们就来详细了解一下java中的变量。 一.变量概念 在程序中&#xff0c;除了有始终不变的常量外&#xff0c;有些内容可能会经常…...

coqui-ai TTS 初步使用

项目地址&#xff1a;https://github.com/coqui-ai/TTS 1. 创建一个新的conda环境&#xff0c;如果自己会管理python环境也可以用其他方法 克隆项目下来 pip install -r requirements.txt # 安装依赖 pip install coqui-tts # 只要命令行工具的话 下载自己想要的模型 …...

matlab代码--卷积神经网络的手写数字识别

1.cnn介绍 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种深度学习的算法&#xff0c;在图像和视频识别、图像分类、自然语言处理等领域有着广泛的应用。CNN的基本结构包括输入层、卷积层、池化层&#xff08;Pooling Layer&#xff09;、全连…...

Scala—Map用法详解

Scala—Map用法详解 在 Scala 中&#xff0c;Map 是一种键值对的集合&#xff0c;其中每个键都是唯一的。Scala 提供了两种类型的 Map&#xff1a;不可变 Map 和可变 Map。 1. 不可变集合&#xff08;Map&#xff09; 不可变 Map 是默认的 Map 实现&#xff0c;位于 scala.co…...

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【六】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

ES6 、ESNext 规范、编译工具babel

ES6 、ESNext 规范、编译工具简介 ES6ES&#xff08;ECMAScript&#xff09; vs JS常量进一步探讨 obj对象的扩展面试&#xff1a;使对象属性也不能更改——Object.freeze(obj) 解构deconstruction变量的解构赋值&#xff1a;数组解构赋值&#xff1a;对象解构赋值&#xff1a;…...

DeepSpeed 配置文件(DeepSpeed Configuration Files)详解:中英文解释

中文版 本文详细介绍 DeepSpeed 配置文件&#xff0c;结合 4 卡 3090 的实际使用场景&#xff0c;重点解释各个参数的含义&#xff0c;并提供应对爆显存的方案。 DeepSpeed 配置文件详解&#xff1a;从基础到实战 DeepSpeed 是用于加速大规模分布式训练的重要工具&#xff0c…...

前端JavaScript(一)---基本介绍

Javascript是一种由Netscape(网景)的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言&#xff0c;主要目的是为了解决服务器端语言&#xff0c;比如Perl&#xff0c;遗留的速度问题&#xff0c;为客户提供更流畅的浏览效果。当时服务端需要对…...

文本处理之sed

1、概述 sed是文本编辑器&#xff0c;作用是对文本的内容进行增删改查。 和vim不一样&#xff0c;sed是按行进行处理。 sed一次处理一行内容&#xff0c;处理完一行之后紧接着处理下一行&#xff0c;一直到文件的末尾 模式空间&#xff1a;临时储存&#xff0c;修改的结果临…...

uniapp在App端定义全局弹窗,当打开关闭弹窗会触发onShow、onHide生命周期怎么解决?

在uniapp(App端)中实现自定义弹框&#xff0c;可以通过创建一个透明页面来实现。点击进入当前页面时&#xff0c;页面背景会变透明&#xff0c;用户可以根据自己的需求进行自定义&#xff0c;最终效果类似于弹框。 遇到问题&#xff1a;当打开弹窗(进入弹窗页面)就会触发当前页…...

计算机网络 实验七 NAT配置实验

一、实验目的 通过本实验理解网络地址转换的原理和技术&#xff0c;掌握扩展NAT/NAPT设计、配置和测试。 二、实验原理 NAT配置实验的原理主要基于网络地址转换&#xff08;NAT&#xff09;技术&#xff0c;该技术用于将内部私有网络地址转换为外部公有网络地址&#xff0c;从…...

数据结构——排序算法第二幕(交换排序:冒泡排序、快速排序(三种版本) 归并排序:归并排序(分治))超详细!!!!

文章目录 前言一、交换排序1.1 冒泡排序1.2 快速排序1.2.1 hoare版本 快排1.2.2 挖坑法 快排1.2.3 lomuto前后指针 快排 二、归并排序总结 前言 继上篇学习了排序的前面两个部分:直接插入排序和选择排序 今天我们来学习排序中常用的交换排序以及非常稳定的归并排序 快排可是有多…...

【kafka04】消息队列与微服务之Kafka 图形工具

Kafka 在 ZooKeeper 里面的存储结构 topic 结构 /brokers/topics/[topic] partition结构 /brokers/topics/[topic]/partitions/[partitionId]/state broker信息 /brokers/ids/[o...N] 控制器 /controller 存储center controller中央控制器所在kafka broker的信息 消费者 /c…...

剖析前后端 API 接口参数设计:JSON 数据结构化全攻略

在当今软件开发领域&#xff0c;前后端分离架构已成为主流趋势。而 API 接口作为前后端之间数据交互的桥梁&#xff0c;其设计的合理性对系统的可维护性和扩展性起着至关重要的作用。JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&…...

vue3 多种方式接受props,定义ref,reactive

定义props 1 第一种 interface AddType { dialogStudyVisible: boolean; } const props defineProps<AddType>(); 第二种 // const props defineProps({ // dialogStudyVisible:{ // type:Boolean, // default:false // } // }) 第三种 // const …...

逻辑处理器核心指纹修改

navigator.hardwareConcurrency的属性,可以用来获取CPU的逻辑处理器核心数。 1、navigator.hardwareConcurrency接口定义&#xff1a; third_party\blink\renderer\core\frame\navigator_concurrent_hardware.idl // https://html.spec.whatwg.org/C/#navigator.hardwarecon…...

如何制作项目网页

一、背景 许多论文里经常会有这样一句话Supplementary material can be found at https://hri-eu.github.io/Lami/&#xff0c;这个就是将论文中的内容或者补充视频放到一个网页上&#xff0c;以更好的展示他们的工作。因此&#xff0c;这里介绍下如何使用前人提供的模板制作我…...

mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?

随笔 从千万粉丝“何同学”抄袭开源项目说起&#xff0c;为何纯技术死路一条&#xff1f; 数据源的统一与拆分 监控报警系统的指标、规则与执行闭环 我们的系统应该配置哪些监控报警项&#xff1f; 监控报警系统如何实现自监控? java 老矣&#xff0c;尚能饭否&#xff…...

1、正则表达式

grep匹配 grep用来过滤文本内容&#xff0c;以匹配要查询的结果。 grep root /etc/passwd&#xff1a;匹配包含root的行 -m 数字&#xff1a;匹配几次后停止 -v&#xff1a;取反-i&#xff1a;忽略字符的大小写&#xff0c;默认的&#xff0c;可以不加-n&#xff1a…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...