Java Poi word 插入图片并添加边框
//得到Picture的Base64编码
Base64Picture p1;
//打开Word文件
Resource resource = new ClassPathResource("doc/ProvinceCollectionReport.docx");
XWPFDocument document = new XWPFDocument(resource.getInputStream());
//遍历段落
List<XWPFParagraph> paragraphs = document.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
//判断此段落是否需要进行替换 我在word文件中用$(Picture来记录图片要存放的未知)
if (paragraph.getText().contains("$(")) {
//遍历每个run
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
//找到要替换的run
if (run.text().contains("$(Picture)")) {
//设置单倍行距,行距为固定值时图片显示不完全
paragraph.setSpacingBetween(1);
//设置居中paragraph.setAlignment(ParagraphAlignment.CENTER);
//清空文字
run.setText("", 0);
//Base64解码
Base64Picture picture = pictures.get(pictureIndex);
String base64String = picture.getBase64String();
String head = base64String.substring(base64String.indexOf('/') + 1, base64String.indexOf(';'));
byte[] decoderBytes = decoder.decode(base64String.substring(base64String.indexOf(',') + 1));
//插入图片
InputStream inputStream = new ByteArrayInputStream(decoderBytes);
//为图片设置黑色边框
XWPFPicture xwpfPicture = run.addPicture(inputStream, getPictureType(head), picture.getFileName(), Units.toEMU(picture.getWidth()), Units.toEMU(picture.getHeight()));
xwpfPicture.getCTPicture().getSpPr().addNewLn().addNewSolidFill().addNewSchemeClr().setVal(STSchemeColorVal.Enum.forString("tx1"));
inputStream.close();
}
}
}
}
至于我是怎么发现的,其实也很简单。Word可以转换为xml格式存储,新建一个有带边框图片和一个不带边框图片的word文件,另存为xml格式,用idea打开可看到xml格式化文件,找到图片位置,类似下图:
不带边框的格式:
带边框的格式:
对比可看出带边框的图片多的是
<a:ln>
<a:solidFill>
<a:schemeClr val="tx1"/>
</a:solidFill>
</a:ln>
因此,通过以下代码即可添加边框
//插入图片并得到插入的图片对象
XWPFPicture xwpfPicture = run.addPicture(inputStream, getPictureType(head), picture.getFileName(), Units.toEMU(picture.getWidth()), Units.toEMU(picture.getHeight()));
//为图片添加边框
xwpfPicture.getCTPicture().getSpPr().addNewLn().addNewSolidFill().addNewSchemeClr().setVal(STSchemeColorVal.Enum.forString("tx1"));
其他属性若查不到资料或文档都可以用这种方法。