使用POI 5.2.2向Word写入HTML时,如何保留Base64图片的宽高?
POI 5.2.2写入Word时Base64图片宽高保留问题解决
场景与问题
我在Java中使用POI 5.2.2将HTML内容写入Word模板,核心代码如下:
MyXWPFHtmlDocument myXWPFHtmlDocument = createHtmlDoc(document, "htmlDoc"); myXWPFHtmlDocument.setHtml(myXWPFHtmlDocument.getHtml().replace( "<body></body>", "<body>"+ StringHtmlFlux + "</body>")); replaceIBodyElementWithAltChunk(document, "${content}", myXWPFHtmlDocument);
其中${content}是模板中的标记位。
目前遇到的问题:本地路径的图片(如<img width="50" height="50" src="C:/Temp/fleur.jpg">)写入Word后能正常保留宽高,但相同尺寸的Base64格式图片(如<img width="50" height="50" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...">)无法保留指定尺寸,尝试添加style标签也未成功。
解决方法
POI的AltChunk处理Base64图片时,对width/height属性的解析逻辑和本地图片不同,需要将宽高属性转换为内联style样式,并且明确指定单位(如px),才能被Word正确识别。
可以通过正则预处理HTML内容中的Base64图片标签:
// 预处理HTML中的Base64图片,将width/height属性转为内联style String processedHtmlFlux = StringHtmlFlux.replaceAll( "<img(.*?)width=\"(\\d+)\"(.*?)height=\"(\\d+)\"(.*?)src=\"data:image/.*?base64,.*?\"", "<img$1style=\"width:$2px; height:$4px;\"$3$5" ); // 替换到HTML文档中 myXWPFHtmlDocument.setHtml(myXWPFHtmlDocument.getHtml().replace( "<body></body>", "<body>"+ processedHtmlFlux + "</body>"));
原理说明
Word对AltChunk中的HTML解析时,Base64图片的原生width/height属性不会被正确映射到Word的图片尺寸,而内联style中的width和height带单位的定义,会被Word的HTML转译引擎正确识别并应用到图片上。
内容的提问来源于stack exchange,提问作者Igniz
相关产品推荐
相关产品推荐

