Я получил файл pptx с простой презентацией. Он имеет фоновое изображение, белый текст на нем, и этот текст имеет тень. Мне нужно упростить представление и убрать все эти вещи (установить backgroun на белый, цвет шрифта на черный и убрать тени)
Изменить цвета bachground и шрифта довольно просто, как это
SlideShow ppt = SlideShowFactory.create(inputStream);
List<Slide> slides= ppt.getSlides();
for (int i = 0; i< slides.size(); i++) {
Slide slide = slides.get(i);
((XSLFSlide)slide).getBackground().setFillColor(Color.white);
XSLFTextShape[] shapes = ((XSLFSlide) slide).getPlaceholders();
for (XSLFTextShape textShape : shapes) {
List<XSLFTextParagraph> textparagraphs = textShape.getTextParagraphs();
for (XSLFTextParagraph para : textparagraphs) {
List<XSLFTextRun> textruns = para.getTextRuns();
for (XSLFTextRun incomingTextRun : textruns) {
incomingTextRun.setFontColor(Color.black);
}
}
Но я не могу понять, как удалить тени. Вот пример до и после
Я пытался вызвать метод getShadow()
в TextShape, но он нулевой, в XSLFTextRun
нет методов для управления текстовыми тенями. Для HSLF я увидел, что есть setShadowed()
для TextRun
. Но как бороться с тенями в XSLF?
Спасибо!
ОБНОВЛЕНИЕ:
Спасибо Акселю Рихтеру за действительно ценный ответ. В моем do c я нашел два случая с затененным текстом.
- Первый, как описал Аксель, решение - очистить тень от CTRegularTextRun. Также я узнаю, что
XSLFTextParagraph.getTextRuns()
может содержать объекты LineBreak, поэтому перед приведением XSLFTextRun.getXMLObject()
- неплохо проверить, что это экземпляр CTRegularTextRun
, а не CTTextLineBreak
Код:
private void clearShadowFromTextRun(XSLFTextRun run) {
if (run.getXmlObject() instanceof CTRegularTextRun) {
CTRegularTextRun cTRun = (CTRegularTextRun) run.getXmlObject();
if (cTRun.getRPr() != null) {
if (cTRun.getRPr().getEffectLst() != null) {
if (cTRun.getRPr().getEffectLst().getOuterShdw() != null) {
cTRun.getRPr().getEffectLst().unsetOuterShdw();
}
}
}
}
}
Второй случай - SlideMaster содержит некоторые определения стилей для тела и заголовка. Поэтому, если мы хотим удалить все тени по-честному - мы должны их тоже очистить.
Код:
private void clearSlideMastersShadowStyles(XMLSlideShow ppt) {
List<XSLFSlideMaster> slideMasters = ppt.getSlideMasters();
for (XSLFSlideMaster slideMaster : slideMasters) {
CTSlideMaster ctSlideMaster = slideMaster.getXmlObject();
if (ctSlideMaster.getTxStyles() != null) {
if (ctSlideMaster.getTxStyles().getTitleStyle() != null) {
clearShadowsFromStyle(ctSlideMaster.getTxStyles().getTitleStyle());
}
if (ctSlideMaster.getTxStyles().getBodyStyle() != null) {
clearShadowsFromStyle(ctSlideMaster.getTxStyles().getBodyStyle());
}
if (ctSlideMaster.getTxStyles().getOtherStyle() != null) {
clearShadowsFromStyle(ctSlideMaster.getTxStyles().getOtherStyle());
}
}
}
}
private void clearShadowsFromStyle(CTTextListStyle ctTextListStyle) {
if (ctTextListStyle.getLvl1PPr() != null) {
if (ctTextListStyle.getLvl1PPr().getDefRPr() != null)
if (ctTextListStyle.getLvl1PPr().getDefRPr().getEffectLst() != null)
if (ctTextListStyle.getLvl1PPr().getDefRPr().getEffectLst().getOuterShdw() != null)
ctTextListStyle.getLvl1PPr().getDefRPr().getEffectLst().unsetOuterShdw();
}
//same stuff for other 8 levels. Ugly uhh...
}