我查看了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);
}
}
}
}
}
}
答案 0 :(得分:1)
如果仅需要获取所有文本内容而与对象无关,则可以完全做到这一点。文本内容包含在org.apache.xmlbeans.XmlString
元素中。在PowerPoint
XML
中,它们在a:t
标记中。命名空间a =“ http://schemas.openxmlformats.org/drawingml/2006/main”。
因此,以下代码获取所有幻灯片中所有对象的所有文本,并使用“ XXXXXXXX”替换不区分大小写的字符串“ test”。
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();
}
}
答案 1 :(得分:0)
for (XSLFShape shape : slide.getShapes()) {
if (shape instanceof XSLFTextBox) {
XSLFTextBox textBox = (XSLFTextBox) shape;
答案 2 :(得分:0)
如果您不喜欢直接通过Xml进行替换的方法,则可以遍历所有幻灯片及其形状。如果形状是XSLFTextShape
,请获取段落并像对待它们一样进行处理。
如果您收到XSLFGroupShape
,请对其getShapes()
进行迭代。由于它们可能包含不同类型的形状,您可以为此使用递归。您也可以处理形状类型XSLFTable
。
但是真正的麻烦始于当您意识到要替换的东西被分成几次运行时;-)