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"));
如有疑问,可联系博主