JAVA编辑word替换指定内容,解决插入图片显示不全问题

在开发过程中,我们可能会遇到需要生成word,或者通过模板word替换相应内容的需求。但在文档中插入图片时,如果段落格式设置不对,就会导致图片只显示一点点或者不显示。接下来就介绍一下java编辑word和插入图片需怎么处理。

1.引入依赖

首先我们在项目中引入Apache POI,用于读取和操作word,这里我使用的版本是4.1.2,版本可以根据项目需求自己选择。

1
2
3
4
5
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>   

2.编辑word

这里是通过模板加入占位符,然后替换占位符的内容

首先我们打开word模板文件

1
2
3
4
5
6
7
8
9
10
String path = "***.docx";
File file = new File(path);
try {
    XWPFDocument template = new XWPFDocument(new FileInputStream(file));
    // 替换内容
    XWPFDocument outWord = PoiWordUtil.replaceWithPlaceholder(template, list);
    return outWord;
} catch (IOException e) {
    log.error("读取模板文件失败", e);
}

替换相应内容

1
// 这里我定义了Placeholder来封装替换数据public static XWPFDocument replaceTextAndImage(XWPFDocument document, List<Placeholder> list) {    for (XWPFParagraph xwpfParagraph : document.getParagraphs()) {        String paragraphText = xwpfParagraph.getText(<em id="__mceDel">        if (StringUtils.isEmpty(paragraphText)) contin</em><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">        for (Placeholder placeholder : list) {</em></em></em></em></em></em><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">            String key = placeholder.getKey();</em></em></em></em></em></em></em><em><em><em><em><em><em><em>            if (paragraphText.contains(key)) {<br>                for (XWPFRun cellRun : xwpfParagraph.getRuns()) {<br>                    String text = cellRun.getText(0);<br>                    if (text != null && text.contains(key)) {<br>                        //获取占位符类型<br>                        String type = placeholder.getType();<br>                        //获取对应key的value<br>                        String value = placeholder.getValue();<br>                        if("0".equals(type)){<br>                            //把文本的内容,key替换为value<br>                            text = text.replace(key, value);<br>                            //把替换好的文本内容,保存到当前这个文本对象<br>                            cellRun.setText(text, 0);<br>                        }else {<br>                            text = text.replace(key, "");<br>                            cellRun.setText(text, 0);<br>                            if (StringUtils.isEmpty(value)) </em></em></em></em></em></em></em><em id="__mceDel"><em id="__mceDel">continue;</em></em><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">                            try {<br>                   // 获取段落行距模式<br>                                int rule = xwpfParagraph.getSpacingLineRule().getValue();<br>                                // 如果段落行距为固定值,会导致图片显示不全,所以需要改成其他模式<br>                                if (LineSpacingRule.EXACT.getValue() == rule) {<br>                                    // 设置段落行距为单倍行距<br>                                    xwpfParagraph.setSpacingBetween(1);<br>                                }<br>                    // 获取文件流<br>                   InputStream imageStream = ImageUtils.getFile(value);</em></em></em></em></em></em></em><em id="__mceDel">                                if (imageStream == null) continue;<br>                                // 通过BufferedImage获取图片信息<br>                                BufferedImage bufferedImage = ImageIO.read(imageStream);<br>                                int height = bufferedImage.getHeight();<br>                                int width = bufferedImage.getWidth();<br>                                // 这里需要重新获取流,之前的流已经被BufferedImage使用掉了<br>                                cellRun.addPicture(ImageUtils.getFile(value), XWPFDocument.PICTURE_TYPE_JPEG, "", Units.toEMU(width), Units.toEMU(height));</em>                            } catch (Exception e) {<br>                                e.printStackTrace();<br>                            }<br>                        }<br>                    }<br>                }<br>            }<br>        }<br>    }<br>    return  document;<br>}

在插入图片时,如果段落的行距设置成了固定值,那么在显示图片时只能显示行距大小的部分,所以当插入图片的段落行距为固定值时,我们需要修改为其他模式,这样图片就能正常大小显示。

然后我们使用cellRun.addPicture()来插入图片,这里我们可以通过BufferedImage来获取图片的尺寸大小。

这样就解决了插入图片显示异常的问题了。

 

posted @   hello龙兄  阅读(622)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示