Изменить шрифт в pptx slide master в Apache POI - PullRequest
0 голосов
/ 30 апреля 2020

Я использую Apache POI для изменения pptx. Я хотел бы изменить шрифт всего pptx сразу.

Я знаю, что в Powerpoint это возможно путем изменения шрифтов темы (если все слайды используют эти шрифты), но я не могу заставить его работать через Apache POI.

На данный момент я обнаружил, что могу установить семейство шрифтов одного XSLFTextRun, используя, например, run.setFontFamily(HSSFFont.FONT_ARIAL).

Редактировать: Я обнаружил, что класс XSLFTheme класса XSLFSlideMaster имеет методы getMajorFont () и getMinorFont (). Я думаю, что это могут быть шрифты, которые мне нужно изменить, но для этих полей нет установщиков.

Спасибо за помощь!

1 Ответ

0 голосов
/ 01 мая 2020

Если ваша попытка сделать то же, что и Изменить шрифт по умолчанию в PowerPoint , то это изменит основной и второстепенный шрифт схемы шрифта в используемой теме.

Вы можно получить XSLFTheme от каждого слайда слайд-шоу, а также от мастера. Но, как вы уже нашли, есть геттеры, но нет сеттеров для основного и вспомогательного шрифта. Поэтому нам нужно использовать классы низкого уровня ooxml-schemas.

В следующем примере кода представлен метод setMajorFont и setMinorFont, который устанавливает начертание шрифта основного и второстепенного шрифта в теме для латинского, восточноазиатского или сложного сценария.

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.xslf.usermodel.*;
import org.openxmlformats.schemas.drawingml.x2006.main.*;

public class PowerPointChangeThemeFonts {

 enum Script {
  LATIN, //Latin script
  EA, //east Asia script
  CS //complex script
 }

 static void setMajorFont(XSLFTheme theme, Script script, String typeFace) {
  CTOfficeStyleSheet styleSheet = theme.getXmlObject();
  CTBaseStyles themeElements = styleSheet.getThemeElements();
  CTFontScheme fontScheme = themeElements.getFontScheme();
  CTFontCollection fontCollection = fontScheme.getMajorFont();
  CTTextFont textFont = null;
  if (script == Script.LATIN) {
   textFont = fontCollection.getLatin();
   textFont.setTypeface(typeFace);
  } else if (script == Script.EA) {
   textFont = fontCollection.getEa();
   textFont.setTypeface(typeFace);
  } else if (script == Script.CS) {
   textFont = fontCollection.getCs();
   textFont.setTypeface(typeFace);
  }
 }

 static void setMinorFont(XSLFTheme theme, Script script, String typeFace) {
  CTOfficeStyleSheet styleSheet = theme.getXmlObject();
  CTBaseStyles themeElements = styleSheet.getThemeElements();
  CTFontScheme fontScheme = themeElements.getFontScheme();
  CTFontCollection fontCollection = fontScheme.getMinorFont();
  CTTextFont textFont = null;
  if (script == Script.LATIN) {
   textFont = fontCollection.getLatin();
   textFont.setTypeface(typeFace);
  } else if (script == Script.EA) {
   textFont = fontCollection.getEa();
   textFont.setTypeface(typeFace);
  } else if (script == Script.CS) {
   textFont = fontCollection.getCs();
   textFont.setTypeface(typeFace);
  }
 }

 public static void main(String args[]) throws Exception {

  XMLSlideShow slideShow = new XMLSlideShow(new FileInputStream("./PPTX.pptx"));

  if (slideShow.getSlideMasters().size() > 0) {
   XSLFSlideMaster master = slideShow.getSlideMasters().get(0);
   XSLFTheme theme = master.getTheme();
   setMajorFont(theme, Script.LATIN, "Courier New");
   setMinorFont(theme, Script.LATIN, "Courier New");
  }

  FileOutputStream out = new FileOutputStream("./PPTXNew.pptx");
  slideShow.write(out);
  out.close();
  slideShow.close();
 }
}
...