
// Extractor.java
// Andrew Davison, ad@coe.psu.ac.th, Nov. 2022

/* Print out all the text extracted from the any 
   Microsoft Excel, Word, or Powerpoint file.

   Compare this to:
     * GetThaiData.java, SheetToWordTable.java
     * ReadParagraphs.java
     * ReadSlidesText.java

  Usage:
    > compile Extractor.java
    > run Extractor <old or new Microsoft fnm>

    e.g.
    > run Extractor Thailand.xlsx
    > run Extractor sample.docx
    > run Extractor prelims.pptx
*/

import java.io.*;
import java.util.*;

import org.apache.poi.extractor.*;
   // many specialized extractors here

import org.apache.poi.ss.extractor.ExcelExtractor;
import org.apache.poi.sl.extractor.SlideShowExtractor;


public class Extractor
{
  public static void main(String[] args)
  {
    if (args.length != 1) {
      System.out.println("Usage: run Extractor <Microsoft fnm>");
      System.exit(0);
    }
    String fnm = args[0];
    POIUtils.reportType(fnm);

    try (FileInputStream fis = new FileInputStream(fnm)){
      System.out.println("Extracting text from " + fnm);
      POITextExtractor extractor = ExtractorFactory.createExtractor(fis);

      // specialized versions of Extractor ------
      if (POIUtils.isExcel(fnm)) {
        ExcelExtractor ee = (ExcelExtractor) extractor;
        ee.setFormulasNotResults(true);   // print the formulae
      }
      else if (POIUtils.isPowerPoint(fnm)) {
        SlideShowExtractor se = (SlideShowExtractor) extractor;
        se.setCommentsByDefault(true);   // include comments text
      }

      // back to the general-purpose extractor
      System.out.println(extractor.getText());

      TreeMap<String,String> mdMap = getMetaData(extractor);
      System.out.println("-------- metadata -------------");
      for (String key: mdMap.keySet())
        System.out.println(key + ": " + mdMap.get(key));
    } 
    catch(Exception e)   
    {  System.out.println(e);  }
  } // end of main()


  private static TreeMap<String,String> 
                      getMetaData(POITextExtractor extractor)
  /* the metadata is a series of lines, each formatted as
     key: value 
  */
  { POITextExtractor metaExt = extractor.getMetadataTextExtractor();
    String md = metaExt.getText().trim();

    String[] mdProps = md.split("\\n");
    TreeMap<String,String> mdMap = new TreeMap<>();

    for (String prop : mdProps) {
      String[] keyVal = prop.split("=");
      if (keyVal.length != 2)
        System.out.println("Metadata entry incorrectly formatted");
      else
        mdMap.put(keyVal[0].trim(), keyVal[1].trim());
    }
    return mdMap;
  }  // getMetaData()

} // end of Extractor class

