如何从十六进制颜色代码中获取 CCTolor?
How can I get a CTColor from a Hex color code?
我正在使用 Apache POI 修改 pptx。我正在尝试更改 XSLFTheme class 的主题颜色。
我想按照此处所述更改 PowerPoint GUI 中可以更改的所有颜色 ("Create my own color theme"):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 中的颜色,我需要一个 CCTolor 作为输入。如何从十六进制颜色代码中获取 CCTolor?
感谢您的帮助!
CTColorScheme
定义了不同的CTColors
:dk1
、lt1
、dk2
、lt2
、accent1
到accent6
、hlink
和 folHlink
。所以首先你需要决定需要设置什么颜色。
我怀疑您的 PowerPoint
演示文稿已经在使用主题,并且想要更改一些主题颜色。如果那是 RGB
颜色,那么您需要使用包含 CTSRgbColors
的 CTColors
覆盖它们。 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
颜色。
我正在使用 Apache POI 修改 pptx。我正在尝试更改 XSLFTheme class 的主题颜色。
我想按照此处所述更改 PowerPoint GUI 中可以更改的所有颜色 ("Create my own color theme"):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 中的颜色,我需要一个 CCTolor 作为输入。如何从十六进制颜色代码中获取 CCTolor?
感谢您的帮助!
CTColorScheme
定义了不同的CTColors
:dk1
、lt1
、dk2
、lt2
、accent1
到accent6
、hlink
和 folHlink
。所以首先你需要决定需要设置什么颜色。
我怀疑您的 PowerPoint
演示文稿已经在使用主题,并且想要更改一些主题颜色。如果那是 RGB
颜色,那么您需要使用包含 CTSRgbColors
的 CTColors
覆盖它们。 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
颜色。