簡體   English   中英

使用 Apache POI 替換 powerpoint 中的所有文本

[英]Replacing all text in powerpoint using Apache POI

我查看了 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();
 }
}

如果不喜歡直接通過 Xml 替換的方法,則可以迭代所有幻燈片及其形狀。 如果形狀是XSLFTextShape ,請獲取段落並像您一樣處理它們。 如果您收到XSLFGroupShape ,也請迭代它們的getShapes() 由於它們可能包含不同類型的形狀,因此您可能會為此使用遞歸。 您也可以處理形狀類型XSLFTable

但是當你意識到你想要替換的東西被分成幾次運行時,真正的麻煩就開始了;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM