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

在Apache POI中更改pptx幻灯片母版中的字体

胡向阳
2023-03-14

我正在使用Apache POI修改pptx。我想立刻改变整个pptx的字体。

我知道在Powerpoint中,通过更改主题的字体(如果幻灯片都使用这些字体),这是可能的,但我无法通过ApachePOI使其工作。

到目前为止,我发现我可以通过使用例如run.setFontFamily(HSSFFont.FONT_ARIAL)来设置单个XSLFTextRun的字体系列。

编辑:我发现 XSLF滑行大师的 XSLF 主题类确实有一个 getMajorFont() 和一个 getMinorFont() 方法。我认为这些可能是我需要更改的字体,但是这些字段没有设置器。

谢谢你的帮助!

共有1个答案

蔺翰音
2023-03-14

如果您的尝试与更改PowerPoint中的默认字体相同,那么这将更改所用主题中字体方案的主要字体和次要字体。

您可以从幻灯片放映的每张幻灯片中获取XSLFTheme,也可以从母版中获取。但是正如你已经发现的,主要字体和次要字体都有getters而没有setters。所以我们需要使用低级的< code>ooxml-schemas类。

下面的代码示例提供了setMajorFontsetMinorFont方法,用于为拉丁脚本、东亚脚本或复杂脚本设置主题中的主要字体和次要字体的类型面。

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.xslf.usermodel.*;
import org.openxmlformats.schemas.drawingml.x2006.main.*;

public class PowerPointChangeThemeFonts {

 enum Script {
  LATIN, //Latin script
  EA, //east Asia script
  CS //complex script
 }

 static void setMajorFont(XSLFTheme theme, Script script, String typeFace) {
  CTOfficeStyleSheet styleSheet = theme.getXmlObject();
  CTBaseStyles themeElements = styleSheet.getThemeElements();
  CTFontScheme fontScheme = themeElements.getFontScheme();
  CTFontCollection fontCollection = fontScheme.getMajorFont();
  CTTextFont textFont = null;
  if (script == Script.LATIN) {
   textFont = fontCollection.getLatin();
   textFont.setTypeface(typeFace);
  } else if (script == Script.EA) {
   textFont = fontCollection.getEa();
   textFont.setTypeface(typeFace);
  } else if (script == Script.CS) {
   textFont = fontCollection.getCs();
   textFont.setTypeface(typeFace);
  }
 }

 static void setMinorFont(XSLFTheme theme, Script script, String typeFace) {
  CTOfficeStyleSheet styleSheet = theme.getXmlObject();
  CTBaseStyles themeElements = styleSheet.getThemeElements();
  CTFontScheme fontScheme = themeElements.getFontScheme();
  CTFontCollection fontCollection = fontScheme.getMinorFont();
  CTTextFont textFont = null;
  if (script == Script.LATIN) {
   textFont = fontCollection.getLatin();
   textFont.setTypeface(typeFace);
  } else if (script == Script.EA) {
   textFont = fontCollection.getEa();
   textFont.setTypeface(typeFace);
  } else if (script == Script.CS) {
   textFont = fontCollection.getCs();
   textFont.setTypeface(typeFace);
  }
 }

 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();
   setMajorFont(theme, Script.LATIN, "Courier New");
   setMinorFont(theme, Script.LATIN, "Courier New");
  }

  FileOutputStream out = new FileOutputStream("./PPTXNew.pptx");
  slideShow.write(out);
  out.close();
  slideShow.close();
 }
}
 类似资料:
  • 我有一个在幻灯片母版上使用不同的母版布局的PPT。每次我们进行更新时,都需要更新特定母版幻灯片上的特定文本框。我想用一个宏来做到这一点。 我有一张幻灯片母版,标题为“幻灯片”,下面有两个版本。它有一个“通用的Bullet_slide ”,下面有10个变体。 在“通用Bullet_Slide”上有一个文本框,其中包含两行:“CONFIG.MGR: [您的姓名], [您的代码], [您的手机号码]“

  • 我想使用Apache POIJava库将pptx幻灯片拆分为几个幻灯片,每个幻灯片只包含一张幻灯片。 创建一个新的XMLSlideSheet并添加幻灯片,如在几个地方(例如 https://www.tutorialspoint.com/apache_poi_ppt/apache_poi_ppt_merging.htm)所述,对我来说不起作用,因为某些布局没有正确导入:字体被更改,文本的位置被更改等

  • 有没有办法把一个幻灯片从一个幻灯片完全复制到另一个幻灯片,包括所有的方框位置,颜色,字体等等。? 参考食谱,我有下面 然而,背景与“from”pptx不匹配,并且一些文本框被移动了。我猜颜色是因为我没有修改母版,而移动是因为与锚相关的东西。我也尝试了我认为会迫使一张幻灯片的母版转移到另一张幻灯片上的方法,但它的作用与上面的相同。

  • 使用幻灯片组件,你需要在 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

  • 我知道如何使用apache poi从ppt文件中提取文本,如下所示 但它提取了所有页脚,幻灯片编号,我不想要 那么如何提取除页脚和幻灯片编号以外的文本 预先感谢

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