freemarker循环展示对象中图片(Java实现导出word)

Ftl文件中,图片展示涉及3块代码
①binaryData :图片的base64格式数据包

    <pkg:part pkg:name="/word/media/image1.jpg" pkg:contentType="image/jpeg" pkg:compression="store">
        <pkg:binaryData>UDBAQEAwUEBAQFBQUGBwwIBwcHUDBAQEAwUEBAQFBQUGBwwIBwcHUDBAQEAwUEBAQFBQUGBwwIBwcH..........
        </pkg:binaryData>
    </pkg:part>
`

②pic:图片在文件中展示位置

				<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
					<pic:nvPicPr>
						<pic:cNvPr id="0" name="t0121e99944f83e0638.jpg" />
						<pic:cNvPicPr />
					</pic:nvPicPr>
					<pic:blipFill>
						<a:blip r:embed="rId1" />
						<a:stretch>
                                                                                     <a:fillRect />
						</a:stretch>
					</pic:blipFill>
					<pic:spPr>
						<a:xfrm>
							<a:off x="0" y="0" />
							<a:ext cx="5238750" cy="2944195" />
						</a:xfrm>
						<a:prstGeom prst="rect">
							<a:avLst />
						</a:prstGeom>
					</pic:spPr>
				</pic:pic>

③Relationship:图片展示位置与数据包的关联

<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.png"/>

以上三块逻辑中的关系如下:
pic中【<a:blip r:embed=“rId1” />】对应Relationship中的【<Relationship Id=“rId1”】
Relationship中的【Target=“media/image1.jpeg” />】对应binaryData 的【<pkg:part pkg:name="/word/media/image1.jpeg"】

看懂之后,具体Java实现如下

 /**
     * 循环图片处理
     *
     * @param start      图片开始编号
     * @param base64List base64格式的图片数组
     * @return base64数据包,relation数据包
     *
     */
    public static Map<String, String> imageRound(Integer start, List<String> base64List) {

        String pkg = "<pkg:part pkg:name=\"/word/media/image${num}.jpeg\" pkg:contentType=\"image/jpeg\" pkg:compression=\"store\">" +
                "<pkg:binaryData>${imgbase64}</pkg:binaryData>" +
                "</pkg:part>";

        String relation = "<Relationship Id=\"rId${num}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"media/image${num}.jpeg\"/>";

        StringBuffer pkgData = new StringBuffer();
        StringBuffer relationData = new StringBuffer();
        for (int j = 0; j < base64List.size(); j++) {
            int num = j + start;
            pkgData.append(pkg.replace("${num}", String.valueOf(num)).replace("${imgbase64}", base64List.get(j)));
            relationData.append(relation.replace("${num}", String.valueOf(num)));
        }


        Map<String, String> map = new HashMap<>();
        //base64数据
        map.put("pkgData", pkgData.toString());
        //和图片关联
        map.put("relationData", relationData.toString());

        return map;
    }

将所有图片转码为64位后,放入List中,作用是为所有图片生成数据包与展示位置的对应关系,相当于我们所说的建立数据库

在对应的.ftl文件中
在 pkg:part同级的标签下写上

${pkgData!}

在<Relationships 标签中写上

${relationData!}

这样就将图片数据库放入文件了

接下来就是到图片位置:num就是编号

  <a:blip r:embed="rId${analyz.num!}">

Java中数据处理如下:

						Map<String, Object> dataMap = new HashMap<>();
						int start = 50;//rid保持一致
                        int i = start;
                        //图片数据
                        List<String> base64List = new ArrayList<>();
                        for (String levelName : collect2) {
                         ...
                            map.put("num", i);
                            base64List.add("base64图片");
                            analyzList.add(map);
                            i++;
                        }
                        dataMap.put("analyzList", analyzList);

                        //处理图片
                        Map<String, String> map = WordImageUtils.imageRound(start, base64List);
                        //base64数据
                        dataMap.put("pkgData", map.get("pkgData"));
                        //和图片关联
                        dataMap.put("relationData",map.get("relationData"));

如有疑问,可联系博主

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值