ZPY博客

二维码批量导出word里图片显示重复问题

之前遗留的一个老项目客户测出一个bug,画面上批量选择二维码导出到word里所有的二维码图片都是一样的。

由于代码不是自己写的,所以必须得看它的代码实现,先一直以为是list处理时传入的图片路径重复了,debug看了首先排除这个。后来看到它里面把图片路径转成了base64了。读取文件时用的是data = new byte[in.available()];这种方式,查了下FileInputStream的available()方法是取得字节大小。这时in.read(data)相当于就是读取整个文件。按理说应该也没问题啊,但是debug看了下二张二维码图片的这个data值前面几十位完全一样。

所以我怀疑图片是不是用这种方式读取会导致重复?但是我打印出两张图片转换后的base64的值,发现是不一样的,因为很长,只有前面几行是一样的。那就证明这种方法读取是没问题的。

继续找其它原因。看到生成word是用的FreeMarker的模板,找到这个模板,里面用的也是list循环,这样取值肯定也不会重复。那么,只有一个可能了,就是这个FreeMarker的模板本身它写的有问题。

FreeMarker的语法不是很清楚,百度一下后,发现在添加图片时的写法果然有问题。FreeMarker里用w:binData来绑定一个base64的图片,用w:name这个名字来存储,后面word里要插入这张图片时,用v:imagedata,src里指定w:name即可。问题就出在这里,遗留的FreeMarker模板代码里所有的w:name都写死了,所以循环时,都会覆盖成最后一张图片的地址。

到此,问题解决。特此记录。