【问题标题】:How can I get a CTColor from a Hex color code?如何从十六进制颜色代码中获取 CTColor?
【发布时间】:2020-05-04 09:48:36
【问题描述】:

我正在使用 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?

感谢您的帮助!

【问题讨论】:

  • 不太清楚您要达到的目标。 CTColorScheme 定义了不同的 CTColors dk1lt1dk2lt2accent1accent6hlinkfolHlink。所以首先你需要决定什么颜色需要改变。其中大多数是CTSRgbColors。而CTSRgbColor 有方法setVal​(byte[] val) 其中byte[] val 是一个字节数组,包含三个字节fpr RGB
  • @AxelRichter 我编辑了问题以使其更清楚。但大多数颜色都是 CTColor s。例如,colorscheme.setDk1() 方法需要一个 CTColor 作为输入。

标签: java apache-poi powerpoint


【解决方案1】:

CTColorScheme 定义了不同的CTColorsdk1lt1dk2lt2accent1accent6hlinkfolHlink。所以首先你需要决定需要设置什么颜色。

我怀疑您已经有一个使用主题的PowerPoint 演示文稿,并且想要更改一些主题颜色。如果那应该是RGB 颜色,那么您需要使用包含CTSRgbColorsCTColors 覆盖它们。而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 颜色。

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多