java 如何將圖片按照原尺寸比例存入word中
java 圖片按照原尺寸比例存入word
在使用poi往word里面插入圖片時(shí)可以使用
XWPFParagraph.insertNewRun(i).addPicture(InputStream pictureData, int pictureType, String filename, int width, int height)方法
但是為了使得插入word中的圖片按照原圖尺寸進(jìn)行等比例縮放,我們必須必須獲得原圖的尺寸,常用的方法就是通過
javax.imageio.ImageIO.read(InputStream input)方法讀取圖片信息,這樣就會(huì)涉及到兩次圖片讀寫,為了減少不必要的網(wǎng)絡(luò)通信,
我們可以使用下面的方式進(jìn)行優(yōu)化:
URL url = new URL(runText);
byte[] bytes = IOUtils.toByteArray(url.openStream());
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
BufferedImage img = javax.imageio.ImageIO.read(bis);
int width = img.getWidth();
int height = img.getHeight();
//下面按照圖片的實(shí)際大小進(jìn)行同比例縮放
int picHeight = 300;
int picWidth = picHeight * width/height;
//下次讀取該ByteArrayInputStream 之前一定要調(diào)用reset進(jìn)行復(fù)位,這樣才能讀到圖片所有數(shù)據(jù)
bis.reset();
para.insertNewRun(i).addPicture(bis,
XWPFDocument.PICTURE_TYPE_JPEG, url.getFile(), Units.toEMU(picWidth), Units.toEMU(picHeight));
好了,上面就是通過ByteArrayInputStream來減少網(wǎng)絡(luò)通信次數(shù)的。
POI導(dǎo)出word中XWPFRun的addPicture方法設(shè)置圖片寬度和高度
XWPFRun run = paragraph.createRun();
InputStream is = getClass().getClassLoader().getResourceAsStream("images/abc.gif");
// 因?yàn)镕ileInputStream沒有重寫reset() 所有將流轉(zhuǎn)為了byte數(shù)組
byte[] bs = IOUtils.toByteArray(is);
BufferedImage image = ImageIO.read(new ByteArrayInputStream(bs));
//int width = MyUnits.pxToEMU(image.getWidth());
//int height = MyUnits.pxToEMU(image.getHeight());
//EMU(英制公制單位)。1 EMU = 1/914400英寸= 1/36000 mm
run.addPicture(new ByteArrayInputStream(bs), Document.PICTURE_TYPE_GIF, "", 685800, 685800);
如果不知道參考的word模板的圖片設(shè)置的大小,則可以雙擊word模板中的圖片,然后查看寬度和高度

addPicture方法中的寬度和高度是EMU(英制公制單位),所有根據(jù)1 EMU = 1/914400英寸= 1/36000 mm轉(zhuǎn)化即可。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot定制type Formatters實(shí)例詳解
在本篇文章里小編給大家整理的是關(guān)于Spring Boot定制type Formatters實(shí)例知識點(diǎn),需要的朋友們學(xué)習(xí)下。2019-11-11
Mybatis 數(shù)據(jù)庫連接池的實(shí)現(xiàn)示例
在Java應(yīng)用程序中,與數(shù)據(jù)庫的連接是非常昂貴的,因此,當(dāng)我們使用MyBatis進(jìn)行數(shù)據(jù)操作時(shí),需要一個(gè)連接池來分配并管理這些連接,本文主要介紹了Mybatis 數(shù)據(jù)庫連接池的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
Spring IOC的三種實(shí)現(xiàn)方式詳解
這篇文章主要介紹了Spring IOC的三種實(shí)現(xiàn)方式,在Spring框架中,IOC通過依賴注入來實(shí)現(xiàn),而依賴注入主要有三種實(shí)現(xiàn)方式,構(gòu)造器注入、Setter注入和字段注入,每種方式都有其特點(diǎn)、適用場景和優(yōu)缺點(diǎn),需要的朋友可以參考下2025-02-02
Java實(shí)用工具之使用oshi獲取主機(jī)信息的方法
這篇文章主要介紹了Java實(shí)用工具之使用oshi獲取主機(jī)信息的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
Java聊天室之實(shí)現(xiàn)使用Socket傳遞音頻
這篇文章主要為大家詳細(xì)介紹了Java簡易聊天室之使用Socket實(shí)現(xiàn)傳遞音頻功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下2022-10-10
Java簡單數(shù)據(jù)加密方法DES實(shí)現(xiàn)過程解析
這篇文章主要介紹了Java簡單數(shù)據(jù)加密方法DES實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
MyBatis-plus+達(dá)夢數(shù)據(jù)庫實(shí)現(xiàn)自動(dòng)生成代碼的示例
這篇文章主要介紹了MyBatis-plus+達(dá)夢數(shù)據(jù)庫實(shí)現(xiàn)自動(dòng)生成代碼的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

