Как я могу получить CTColor из цветового кода Hex? - PullRequest
0 голосов
/ 04 мая 2020

Я использую Apache POI для изменения pptx. Я пытаюсь изменить цвета темы класса XSLFTheme.

Я хотел бы изменить все цвета, которые можно изменить в PowerPoint GUI, как описано здесь («Создать собственную цветовую тему»): https://support.office.com/en-us/article/change-a-theme-and-make-it-the-default-in-word-or-excel-c846f997-968e-4daa-b2d4-42bd2afef904

Цветовая схема темы, которую я получаю со следующим кодом:

CTOfficeStyleSheet styleSheet = xslfTheme.getXmlObject();
CTBaseStyles themeElements = styleSheet.getThemeElements();
CTColorScheme colorscheme = themeElements.getClrScheme();

Для изменения цветов в CTColorScheme мне нужен CTColor в качестве входных данных. Как я могу получить CTColor из цветового кода Hex?

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

1 Ответ

1 голос
/ 04 мая 2020

CTColorScheme определяет различные CTColors: dk1, lt1, dk2, lt2, accent1 до accent6, hlink и folHlink. Поэтому сначала вам нужно решить, какой цвет нужно установить.

Я подозреваю, что у вас есть презентация PowerPoint, в которой уже используется тема, и вы хотите изменить некоторые цвета темы. Если это будет RGB цветов, вам нужно перезаписать их, используя CTColors, содержащий CTSRgbColors. И CTSRgbColor имеет метод setVal​(byte[] val), где byte[] val - это байтовый массив, содержащий три байта для RGB.

Если необходимо использовать шестнадцатеричную строку, например "FF00FF", для определения цвета вместо непосредственного использования байтового массива, тогда можно использовать org.apache.commons.codec.binary.Hex. Это обеспечивает метод Hex.decodeHex, который берет строку и декодирует ее в байтовый массив. Библиотека commons-codec является обязательным условием apache poi.

Пример:

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

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

import org.apache.commons.codec.binary.Hex;

public class PowerPointChangeThemeColors {

 enum ThemeColor {
  DK1, //Dark1
  LT1, //Light1
  DK2, //Dark2
  LT2, //Light2
  ACCENT1, //Accent1
  ACCENT2, //Accent2
  ACCENT3, //Accent3
  ACCENT4, //Accent4
  ACCENT5, //Accent5
  ACCENT6, //Accent6
  HLINK, //Hyperlink
  FOLHLINK //FollowedHyperlink
 }

 static void setThemeColor(XSLFTheme theme, ThemeColor color, String rgbS) throws Exception {
  CTOfficeStyleSheet styleSheet = theme.getXmlObject();
  CTBaseStyles themeElements = styleSheet.getThemeElements();
  CTColorScheme colorScheme = themeElements.getClrScheme();
  CTColor ctColor = CTColor.Factory.newInstance();
  CTSRgbColor sRgbColor = ctColor.addNewSrgbClr();
  byte[] rgbB = Hex.decodeHex(rgbS);
  sRgbColor.setVal(rgbB);
  if (color == ThemeColor.DK1) {
   colorScheme.setDk1(ctColor);
  } else if (color == ThemeColor.LT1) {
   colorScheme.setLt1(ctColor);
  } else if (color == ThemeColor.DK2) {
   colorScheme.setDk2(ctColor);
  } else if (color == ThemeColor.LT2) {
   colorScheme.setLt2(ctColor);
  } else if (color == ThemeColor.ACCENT1) {
   colorScheme.setAccent1(ctColor);
  } else if (color == ThemeColor.ACCENT2) {
   colorScheme.setAccent2(ctColor);
  } else if (color == ThemeColor.ACCENT3) {
   colorScheme.setAccent3(ctColor);
  } else if (color == ThemeColor.ACCENT4) {
   colorScheme.setAccent4(ctColor);
  } else if (color == ThemeColor.ACCENT5) {
   colorScheme.setAccent5(ctColor);
  } else if (color == ThemeColor.ACCENT6) {
   colorScheme.setAccent6(ctColor);
  } else if (color == ThemeColor.HLINK) {
   colorScheme.setHlink(ctColor);
  } else if (color == ThemeColor.FOLHLINK) {
   colorScheme.setFolHlink(ctColor);
  }
 }

 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();
   setThemeColor(theme, ThemeColor.DK1, "0000FF");
   setThemeColor(theme, ThemeColor.ACCENT1, "FF0000");
  }

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

Получает PPTX.pptx, получает свою тему и меняет цвета темы dk1 (dark1) ), который является темным цветом по умолчанию, используемым в качестве цвета шрифта, например, и accent1, который является первым акцентным цветом, в определенные пользователем цвета RGB.

...