В кулинарной книге Apache POI и других примерах рассказывается о прямом добавлении изображения в PowerPoint, как показано ниже:
XMLSlideShow ppt = new XMLSlideShow();
ppt.createSlide();
byte[] pictureData = IOUtils.toByteArray(new FileInputStream("logo-leaf.png"));
XSLFPictureData pd
= ppt.addPicture(pictureData, PictureData.PictureType.PNG);
XSLFPictureShape picture = slide.createPicture(pd);
picture.setAnchor(new Rectangle(320, 230, 100, 92));
И это работает очень хорошо, как и ожидалось.
Мне нужен абзац, в котором будет отображаться изображение профиля пользователя рядом с именем и адресом, повторяющимся в соответствии с данными –
.
Это похоже на то, что мы обычно видим на страницах социальных сетей, показанных на изображении выше, которые могут распространяться на слайды.
Я пробовал, но нашел подходящие методы в XSLFShape
.
Возможно, есть лучший способ отобразить это, чем использовать абзац. Любой блок кода, указатели приветствуются.
Сам PowerPoint не позволяет вставлять изображение в середину абзаца, поэтому не существует способа автоматизировать это за пределами PowerPoint. Можно было бы сделать это с помощью таблицы, но вставка изображений в ячейки таблицы приводит к искажению изображений, если только они и ячейка не находятся в одинаковых пропорциях. Лучше всего, вероятно, вставить отдельные фигуры для каждого блока текста и соответствующего изображения.
Возможно, вы захотите создать групповые фигуры, группирующие текстовое поле и фигуру изображения.
Пример:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.sl.usermodel.*;
import org.apache.poi.xslf.usermodel.*;
import org.apache.commons.io.IOUtils;
import java.awt.Rectangle;
public class CreatePPTXGroupShape {
public static void main(String[] args) throws Exception {
Object[][] data = new Object[][] {
new Object[] {"Koala", IOUtils.toByteArray(new FileInputStream("./Koala.png"))},
new Object[] {"Squirrel", IOUtils.toByteArray(new FileInputStream("./Squirrel.png"))},
new Object[] {"Fox", IOUtils.toByteArray(new FileInputStream("./Fox.png"))}
};
SlideShow slideShow = new XMLSlideShow();
Slide slide = slideShow.createSlide();
int groupLeft = 100;
int groupTop = 50;
int groupWidth = 250;
int groupHeight = 100;
int groupPadding= 10;
for (Object[] row : data) {
GroupShape shapeGroup = slide.createGroup();
shapeGroup.setInteriorAnchor(new Rectangle(groupLeft, groupTop, groupWidth, groupHeight));
shapeGroup.setAnchor(new Rectangle(groupLeft+groupPadding, groupTop+groupPadding, groupWidth-groupPadding, groupHeight-groupPadding));
int x = groupLeft;
int y = groupTop;
int width = 100;
int height = 100;
TextShape textShape = shapeGroup.createTextBox();
Rectangle rect = new Rectangle(x, y, width, height);
textShape.setAnchor(rect);
String text = (String)row[0];
textShape.setText(text);
x = groupLeft + 150;
y = groupTop;
width = 100;
height = 100;
byte[] pictureDataByte = (byte[])row[1];
PictureData pictureData = slideShow.addPicture(pictureDataByte, PictureData.PictureType.PNG);
PictureShape pictureShape = shapeGroup.createPicture(pictureData);
rect = new Rectangle(x, y, width, height);
pictureShape.setAnchor(rect);
groupTop += 110;
}
FileOutputStream out = new FileOutputStream("./CreatePPTXGroupShape.pptx");
slideShow.write(out);
out.close();
}
}
Результат:
Будем признательны за объяснение использования GroupShape
на полном рабочем примере. После того, как я опубликовал вопрос, я попробовал использовать XSLFTable
, но не смог заставить решение работать. Спасибо @Axel.
Я не понимаю причину отрицательного голосования, потому что я не смог найти ни одного метода в
XSLFShape
для этого, ни какого-либо рабочего примера включения изображения в фигуру.