当前位置: 首页 > 知识库问答 >
问题:

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

钱安和
2023-03-14

我得到了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);
                }
            }

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

谢谢!

更新:

谢谢Axel Richter非常有价值的回答。在我的文件里我发现了两个带有阴影文字的病例。

    null
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();
                }
            }
        }
    }
}

代码:

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...
    }

共有1个答案

甄霖
2023-03-14

文本阴影设置尚未在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();
        }
       }
      }
...
 类似资料:
  • 使用幻灯片组件,你需要在 sm.js 和 sm.css 之后额外引入如下两个文件: <link rel="stylesheet" href="//g.alicdn.com/msui/sm/0.6.2/css/sm-extend.min.css"> <script type='text/javascript' src='//g.alicdn.com/msui/sm/0.6.2/js/sm-exte

  • Progress,进度条,用于上传、下载等耗时并且需要显示进度的场景,用户可以随时中断该操作。在mpvue框架中实现这个功能是基于小程序的原生progress 组件,这里主要说一下它percent属性: percent 类型:Float 默认值:无 可选值:0-100 说明:百分比0~100 要实现上传或者下载过程中显示进度的效果,就需要实时修改 percent属性的值,下面示例代码是每隔 20m

  • 幻灯片秀 自动依顺序显示每张图像。 播放幻灯片秀 同时播放音乐与幻灯片秀 使用操作接口 利用PSP™主机的按钮或线控装置进行操作

  • 幻灯片相关的标签有两个,slides和 noslides slides标签 这个标签其实就一个循环标签,只是会把你指定的幻灯片数据获取出来 | 标签名 | 作用 | 包含属性 | | --- | --- | --- | | slides | 生成幻灯片 |id,item | 标签属性: | 标签属性名 | 含义 | | --- | --- | | id |后台幻灯片 id,必须 | | item

  • 在后台扩展工具》幻灯片分类 添加分类标识为"portal_index"的分类,然后在此分类添加幻灯片; cat_name:幻灯片类型名称 cat_idname:幻灯片标示 slide_name:幻灯片名称 slide_pic:幻灯片图片地址 slide_url:幻灯片URL slide_des:幻灯片描述 slide_content:幻灯片内容 <php> $home_slides=sp_get

  • sp_getslide($slide,$limit=5,$order = "listorder ASC") 功能: 根据幻灯片标识获取所有幻灯片 参数: $slide:幻灯片标识,后台可以设置 $limit:最多显示几张幻灯片 $order:按什么字段(slide表的字段)排序 返回 数组,符合条件的幻灯片列表 示例: $slides=sp_getslide('top_slide');