Как добавить изображение в абзац при использовании Apache POI при создании презентации PowerPoint с использованием XMLSlideShow?

В кулинарной книге 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.

Возможно, есть лучший способ отобразить это, чем использовать абзац. Любой блок кода, указатели приветствуются.

Я не понимаю причину отрицательного голосования, потому что я не смог найти ни одного метода в XSLFShape для этого, ни какого-либо рабочего примера включения изображения в фигуру.

Mahesh 11.04.2024 04:57

Сам PowerPoint не позволяет вставлять изображение в середину абзаца, поэтому не существует способа автоматизировать это за пределами PowerPoint. Можно было бы сделать это с помощью таблицы, но вставка изображений в ячейки таблицы приводит к искажению изображений, если только они и ячейка не находятся в одинаковых пропорциях. Лучше всего, вероятно, вставить отдельные фигуры для каждого блока текста и соответствующего изображения.

Steve Rindsberg 11.04.2024 17:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
182
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возможно, вы захотите создать групповые фигуры, группирующие текстовое поле и фигуру изображения.

Пример:

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.

Mahesh 13.04.2024 06:37

Другие вопросы по теме