java - 使用 Apache POI 替换 powerpoint 中的所有文本

标签 java apache apache-poi powerpoint

我查看了 apache POI 文档并创建了一个函数来编辑 powerpoint 中的所有文本。该函数可以很好地替换幻灯片中的文本,但不能替换分组文本框中的文本。是否有单独的对象来处理分组的项目?

private static void redactText(XMLSlideShow ppt) {
    for (XSLFSlide slide : ppt.getSlides()) {
        System.out.println("REDACT Slide: " + slide.getTitle());

        XSLFTextShape[] shapes = slide.getPlaceholders();

        for (XSLFTextShape textShape : shapes) {

            List<XSLFTextParagraph> textparagraphs = textShape.getTextParagraphs();

            for (XSLFTextParagraph para : textparagraphs) {

                List<XSLFTextRun> textruns = para.getTextRuns();

                for (XSLFTextRun incomingTextRun : textruns) {

                    String text = incomingTextRun.getRawText();

                    System.out.println(text);

                    if (text.toLowerCase().contains("test")) {

                        String newText = text.replaceAll("(?i)" + "test", "XXXXXXXX");

                        incomingTextRun.setText(newText);

                    }
                }
            }

        }
    }
}

最佳答案

如果需要只是获取所有文本内容,而不管它是什么对象,那么人们可以简单地做到这一点。文本内容包含在 org.apache.xmlbeans.XmlString 元素中。在 PowerPoint XML 中,它们位于 a:t 标记中。命名空间 a="http://schemas.openxmlformats.org/drawingml/2006/main"。

因此,以下代码获取所有幻灯片中所有对象中的所有文本,并将不区分大小写的字符串“test”替换为“XXXXXXXX”。

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

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

import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlString;

public class ReadPPTXAllText {

 public static void main(String[] args) throws Exception {

  XMLSlideShow slideShow = new XMLSlideShow(new FileInputStream("MicrosoftPowerPoint.pptx"));
  for (XSLFSlide slide : slideShow.getSlides()) {
   CTSlide ctSlide = slide.getXmlObject();
   XmlObject[] allText = ctSlide.selectPath(
    "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' " +
    ".//a:t"
   );
   for (int i = 0; i < allText.length; i++) {
    if (allText[i] instanceof XmlString) {
     XmlString xmlString = (XmlString)allText[i];
     String text = xmlString.getStringValue();
System.out.println(text);
     if (text.toLowerCase().contains("test")) {
      String newText = text.replaceAll("(?i)" + "test", "XXXXXXXX");
      xmlString.setStringValue(newText);
     }
    }
   }
  }

  FileOutputStream out = new FileOutputStream("MicrosoftPowerPointChanged.pptx");
  slideShow.write(out);
  slideShow.close();
  out.close();
 }
}

关于java - 使用 Apache POI 替换 powerpoint 中的所有文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52478351/

相关文章:

java - JPQL 查询 - 实体包含多头列表

Java线程级沙箱

regex - htaccess重定向,不带路径

Java Apache POI - XSSFCell setFillBackgroundColor 没有效果

java - 更改CharacterRun的字体类型

java - 如何适应单元格大小

java - 在android中获取versionCode时包管理器死掉了

java - 同步 Java Visualizer 音频和视频

java - 如果 ACE 服务器关闭,如何启动目标

apache - 如果不存在图像则显示默认图像