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

如何使用Apache POI for PowerPoint在XSLFGraphicFrame中读取文本

汝宏伯
2023-03-14

我正在制作一个Java程序来查找文档中出现的特定关键字。我想阅读多种类型的文件格式,包括所有Microsoft Office文档。

我已经用除了PowerPoint之外的所有程序做好了,我用的是在StackOverflow或其他资源上找到的Apache POI代码片段。我发现所有的幻灯片都是由形状组成的(XSLFTextShape ),但其中许多是XSLFGraphicFrame或XSLFTable类的对象,我不能简单地使用toString()方法。我如何使用Java提取其中包含的所有文本。这是一段代码\伪代码:

File f = new File("C:\\Users\\Windows\\Desktop\\Modulo 9.pptx");
PrintStream out = System.out;

FileInputStream is = new FileInputStream(f);
XMLSlideShow ppt = new XMLSlideShow(is);
for (XSLFSlide slide : ppt.getSlides()) {
    for (XSLFShape shape : slide) {
       if (shape instanceof XSLFTextShape) {
       XSLFTextShape txShape = (XSLFTextShape) shape;
       out.println(txShape.getText());
       } else if (shape instanceof XSLFPictureShape) {
        //do nothing
       } else if (shape instanceof XSLFGraphicFrame or XSLFTable ) {
       //print all text in it or in its children
       }
    }
}

共有1个答案

王建华
2023-03-14

如果您的需求“在文档中查找特定关键字的出现”需要简单地在< code>SlideShows的所有文本内容中搜索,那么简单地使用SlideShowExtractor可能是一种方法。这也可以作为POITextExtractor的入口点,用于获取文档元数据/属性的文本内容,如作者和标题。

例:

import java.io.FileInputStream;

import org.apache.poi.xslf.usermodel.*;
import org.apache.poi.sl.usermodel.SlideShow;
import org.apache.poi.sl.extractor.SlideShowExtractor;

import org.apache.poi.extractor.POITextExtractor;

public class SlideShowExtractorExample {

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

  SlideShow<XSLFShape,XSLFTextParagraph> slideshow 
   = new XMLSlideShow(new FileInputStream("Performance_Out.pptx"));

  SlideShowExtractor<XSLFShape,XSLFTextParagraph> slideShowExtractor 
   = new SlideShowExtractor<XSLFShape,XSLFTextParagraph>(slideshow);
  slideShowExtractor.setCommentsByDefault(true);
  slideShowExtractor.setMasterByDefault(true);
  slideShowExtractor.setNotesByDefault(true);

  String allTextContentInSlideShow = slideShowExtractor.getText();

System.out.println(allTextContentInSlideShow);

System.out.println("===========================================================================");

  POITextExtractor textExtractor = slideShowExtractor.getMetadataTextExtractor();
  String metaData = textExtractor.getText();

System.out.println(metaData);

 }
}

当然,有一些<code>XSLFGraphicFrame</code>不被<code>SlideShowExtractor</code>读取,因为直到现在,<code>apache poi</code>都不支持它们。例如,各种SmartArt图形。它们的文本内容存储在/ppt/diagrams/data*中。xml记录幻灯片中引用的部分。由于apachepoi目前还不支持此功能,因此只能使用底层底层方法读取。

例如,要从< code>SmartArt图形中的所有/ppt/diagrams/data文本中获取所有文本,我们可以:

...
System.out.println("===========================================================================");

//additionally get all text out of all /ppt/diagrams/data which are texts in SmartArt graphics:
  StringBuilder sb = new StringBuilder();
  for (XSLFSlide slide : ((XMLSlideShow)slideshow).getSlides()) {
   for (org.apache.poi.ooxml.POIXMLDocumentPart part : slide.getRelations()) {
    if (part.getPackagePart().getPartName().getName().startsWith("/ppt/diagrams/data")) {
     org.apache.xmlbeans.XmlObject xmlObject = org.apache.xmlbeans.XmlObject.Factory.parse(part.getPackagePart().getInputStream());
     org.apache.xmlbeans.XmlCursor cursor = xmlObject.newCursor();
     while(cursor.hasNextToken()) {
      if (cursor.isText()) {
       sb.append(cursor.getTextValue() + "\r\n");
      }
      cursor.toNextToken();
     }
     sb.append(slide.getSlideNumber() + "\r\n\r\n");
    }
   }
  }
  String allTextContentInDiagrams = sb.toString();

System.out.println(allTextContentInDiagrams);
...
 类似资料:
  • 问题内容: 我试图将文本文件加载到我的JavaScript文件中,然后从该文件中读取行以获取信息,我尝试使用FileReader,但它似乎无法正常工作。有人可以帮忙吗? 问题答案: 是的,可以使用FileReader,我已经做了一个示例,这是代码: 最后,我只是读了其他一些吸引我的答案,但正如他们所建议的那样,您可能正在寻找使您能够从JavaScript文件所在的服务器(或设备)加载文本文件的代码

  • 我想从文本文件中读取文本。在下面的代码中,会发生异常(这意味着它会转到catch块)。我将文本文件放在应用程序文件夹中。我应该把这个文本文件(mani.txt)放在哪里才能正确阅读?

  • 本文向大家介绍如何使用python读取Selenium中的文本文件?,包括了如何使用python读取Selenium中的文本文件?的使用技巧和注意事项,需要的朋友参考一下 我们可以通过先创建一个txt文件并在其中包含内容,来使用python阅读Selenium中的文本文件。 首先,我们需要打开文件并提及文本文件位置的路径作为参数。有多种读取方法可以执行这些操作。 read() –读取文件的全部内容

  • 问题内容: 如何将a转换为a ? 问题答案: 这取决于最适合您的方式。明智地提高生产力,不要重蹈覆辙,而是使用Apache Commons。在哪。

  • 问题内容: 是否可以在AngularJS中读取文件?我想将文件放入HTML5画布进行裁剪。 我在考虑使用指令吗?这是我要放入指令中的javascript代码: 问题答案: 是的,指令是正确的方法,但看起来有些不同: 工作示例:http : //plnkr.co/edit/y5n16v?p=preview 感谢lalalalalmbda提供此链接。

  • 问题内容: 我正在使用javax.mail开发客户端邮件以读取邮箱中的邮件: 我知道该方法返回一个对象,因为内容可能是a ,a ,a 和其他(我认为)…是否有一种方法可以使消息始终位于消息正文中?谢谢!! 问题答案: 这个答案扩展了尤林的答案]。他提出的问题是a的内容本身可能是另一内容。在这种情况下,下面的方法将在内容上重复进行,直到完全解析了邮件正文为止。