POI在word中插入图片
今天遇到一个新的任务:需要在一个word文件中插入一个流程图
一开始:使用默认方法插入流程图片但是发现默认图片总是嵌入布局无法展示完整
后来稍微调整了一下设置了一下段落格式 重新创建了一个新的段落去作为“容器”
public static void insertImageAtPlaceholder(XWPFDocument document, String placeholderPattern, String imagePath) throws IOException, InvalidFormatException {
Pattern pattern = Pattern.compile(placeholderPattern);
List<XWPFParagraph> paragraphs = document.getParagraphs();
for (int i = 0; i < paragraphs.size(); i++) {
XWPFParagraph paragraph = paragraphs.get(i);
List<XWPFRun> runs = paragraph.getRuns();
if (runs != null) {
for (XWPFRun run : runs) {
String text = run.getText(0);
if (text != null) {
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
// 移除占位符
run.setText("", 0);
// 在当前段落后创建新段落
XWPFParagraph imageParagraph = document.insertNewParagraph(paragraph.getCTP().newCursor());
// 设置段落属性
imageParagraph.setAlignment(ParagraphAlignment.CENTER);
imageParagraph.setSpacingBefore(500);
imageParagraph.setSpacingAfter(500);
// 创建新的运行
XWPFRun newRun = imageParagraph.createRun();
try (FileInputStream is = new FileInputStream(imagePath)) {
// 获取图片实际尺寸
BufferedImage bimg = ImageIO.read(new File(imagePath));
int width = bimg.getWidth();
int height = bimg.getHeight();
// 计算合适的显示尺寸
double scaleFactor = 0.7;
int scaledWidth = (int) (width * scaleFactor);
int scaledHeight = (int) (height * scaleFactor);
// 插入图片
newRun.addPicture(
is,
Document.PICTURE_TYPE_PNG,
imagePath,
Units.pixelToEMU(scaledWidth),
Units.pixelToEMU(scaledHeight)
);
}
break;
}
}
}
}
}
}
最终结果: