gpt4 book ai didi

java - Apache POI XSLF 删除幻灯片上文本的阴影

转载 作者:行者123 更新时间:2023-12-02 01:02:03 27 4
gpt4 key购买 nike

我得到了带有简单演示的 pptx 文件。它有背景图像,上面有白色文本,并且该文本有阴影。我需要简化演示并删除所有这些内容(将背景设置为白色,将字体颜色设置为黑色并删除阴影)

更改 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);
}
}

但我不知道如何消除阴影。这是之前和之后的例子 Before After

我尝试在 TextShape 上调用 getShadow() 方法,但它为 null,在 XSLFTextRun 中没有管理文本阴影的方法。对于 HSLF,我看到有用于 TextRunsetShadowed()。但是如何处理 XSLF 中的阴影呢?

谢谢!

更新:

感谢 Axel Richter 提供的非常有值(value)的答案。在我的文档中,我发现两个带有阴影文本的案例。

  1. 第一个正如 Axel 所描述的,解决方案是从 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...
    }

    最佳答案

    XSLFTextRun 中尚未实现文本阴影设置。当然,它们是在 XML 中设置的。

    具有阴影文本的运行看起来像:

    <a:r>
    <a:rPr lang="de-DE" smtClean="0" dirty="0" b="1">
    <a:effectLst>
    <a:outerShdw dir="2700000" algn="tl" dist="38100" blurRad="38100">
    <a:srgbClr val="000000">
    <a:alpha val="43137"/>
    </a:srgbClr>
    </a:outerShdw>
    </a:effectLst>
    </a:rPr>
    <a:t>The text...</a:t>
    </a:r>

    如您所见,有一个 rPr (运行属性),其 effectLst 具有 outerShdw 元素。我们可以使用 ooxml-schemas 类和方法来设置和取消设置。

    ...
    incomingTextRun.setFontColor(Color.black);

    org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun cTRun = (org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun)incomingTextRun.getXmlObject();
    if (cTRun.getRPr() != null) {
    if (cTRun.getRPr().getEffectLst() != null) {
    if (cTRun.getRPr().getEffectLst().getOuterShdw() != null) {
    cTRun.getRPr().getEffectLst().unsetOuterShdw();
    }
    }
    }
    ...

    关于java - Apache POI XSLF 删除幻灯片上文本的阴影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60523692/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com