Как читать текст в XSLFGraphicFrame с помощью Apache POI для PowerPoint - PullRequest
0 голосов
/ 30 декабря 2018

Я делаю Java-программу для поиска вхождений определенного ключевого слова в документах.Я хочу прочитать много типов файловых форматов, включая все документы Microsoft Office.

Я уже сделал это со всеми из них, кроме PowerPoint, я использую фрагменты кода Apache POI, найденные в StackOverflow или в других источниках.Я обнаружил, что все слайды сделаны из фигур (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 Ответ

0 голосов
/ 31 декабря 2018

Если ваше требование "найти в документе вхождения определенного ключевого слова" требует простого поиска по всему текстовому содержимому 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);

 }
}

Конечно, существуют виды XSLFGraphicFrame, которые не читаются SlideShowExtractor, потому что они не поддерживаются apache poi до сих пор.Например, все виды SmartArt графика .Их текстовое содержимое хранится в /ppt/diagrams/data*.xml частях документа, на которые ссылаются слайды.Поскольку apache poi не поддерживает это до сих пор, его можно прочитать только с использованием низкоуровневых базовых методов.

Например, чтобы дополнительно получить весь текст из всех / ppt / diagrams / data, которые являются текстами в SmartArt Графика, которую мы могли бы сделать:

...
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);
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...