Thymeleaf制作word模板显示base64字符串为图片
时间: 2023-12-30 14:06:17 浏览: 157
要在Thymeleaf制作的Word模板中将Base64字符串显示为图片,可以使用以下步骤:
1. 在Word模板中插入一个图片占位符,例如:
```
<img th:replace="image :: imageTag" />
<th:block th:fragment="imageTag">
[图片]
</th:block>
```
2. 在Thymeleaf模板中定义一个名为`image`的片段,例如:
```
<w:p>
<w:r>
<w:t>我的图片:</w:t>
</w:r>
</w:p>
<w:p th:fragment="image">
<w:r>
<w:drawing>
<wp:inline distT="0" distB="0" distL="0" distR="0">
<wp:extent cx="400000" cy="300000" />
<wp:effectExtent l="0" r="0" t="0" b="0" />
<wp:docPr id="1" name="图片 1" />
<wp:cNvGraphicFramePr>
<a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1" />
</wp:cNvGraphicFramePr>
<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:nvPicPr>
<pic:cNvPr id="0" name="图片" />
<pic:cNvPicPr />
</pic:nvPicPr>
<pic:blipFill>
<a:blip r:embed="{imageId}" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" />
<a:stretch>
<a:fillRect />
</a:stretch>
</pic:blipFill>
<pic:spPr>
<a:xfrm>
<a:off x="0" y="0" />
<a:ext cx="400000" cy="300000" />
</a:xfrm>
<a:prstGeom prst="rect">
<a:avLst />
</a:prstGeom>
</pic:spPr>
</pic:pic>
</a:graphicData>
</a:graphic>
</wp:inline>
</w:drawing>
</w:r>
</w:p>
```
请注意,此代码中的`{imageId}`将在后面的步骤中替换为图片的ID。
3. 在Java代码中使用Apache POI打开Word模板,并将Base64字符串转换为图片插入到文档中,例如:
```java
XWPFDocument doc = new XWPFDocument(new FileInputStream("template.docx"));
// 将Base64字符串转换为图片
byte[] imageBytes = Base64.getDecoder().decode(base64String);
InputStream imageStream = new ByteArrayInputStream(imageBytes);
int imageType = getImageType(imageBytes);
int imageWidth = getImageWidth(imageBytes);
int imageHeight = getImageHeight(imageBytes);
// 将图片插入到文档中
XWPFParagraph imagePara = doc.getParagraphArray(0);
XWPFRun imageRun = imagePara.getRuns().get(0);
int imageId = doc.addPictureData(imageStream, imageType);
String blipId = doc.getAllPictures().get(imageId - 1).getPackageRelationship().getId();
imageRun.getCTR().addNewDrawing().addNewInline().addNewExtent().setCx(imageWidth * 9525);
imageRun.getCTR().getDrawingArray(0).getInlineArray(0).addNewDocPr().setId(0);
imageRun.getCTR().getDrawingArray(0).getInlineArray(0).addNewDocPr().setName("图片", Locale.ENGLISH);
imageRun.getCTR().getDrawingArray(0).getInlineArray(0).addNewDocPr().setDescr("图片");
imageRun.getCTR().getDrawingArray(0).getInlineArray(0).addNewGraphic().addNewGraphicData().addNewPic().addNewBlipFill().addNewBlip().setEmbed(blipId);
imageRun.getCTR().getDrawingArray(0).getInlineArray(0).getExtent().setCy(imageHeight * 9525);
// 替换模板中的{imageId}为图片ID
String xml = doc.getDocument().getBody().xmlText();
xml = xml.replace("{imageId}", blipId);
doc.getDocument().getBody().set(xml);
doc.write(new FileOutputStream("output.docx"));
doc.close();
```
请注意,此代码中的`getImageType`,`getImageWidth`和`getImageHeight`函数是用于获取图片类型、宽度和高度的自定义函数。
完成以上步骤后,生成的Word文档中将显示Base64字符串作为图片。
阅读全文