package mj.ocraptor.file_handler; import static mj.ocraptor.file_handler.filter.FileType.APPLE_KEY; import static mj.ocraptor.file_handler.filter.FileType.APPLE_NUMBERS; import static mj.ocraptor.file_handler.filter.FileType.APPLE_PAGES; import static mj.ocraptor.file_handler.filter.FileType.EPUB; import static mj.ocraptor.file_handler.filter.FileType.LO_CALC; import static mj.ocraptor.file_handler.filter.FileType.LO_IMPRESS; import static mj.ocraptor.file_handler.filter.FileType.LO_WRITER; import static mj.ocraptor.file_handler.filter.FileType.PS; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import mj.ocraptor.configuration.Config; import mj.ocraptor.configuration.properties.ConfigBool; import mj.ocraptor.configuration.properties.ConfigInteger; import mj.ocraptor.extraction.tika.parser.epub.EpubParser; import mj.ocraptor.extraction.tika.parser.html.HtmlParser; import mj.ocraptor.extraction.tika.parser.image.ImageParser; import mj.ocraptor.extraction.tika.parser.iwork.IWorkPackageParser; import mj.ocraptor.extraction.tika.parser.microsoft.OfficeParser; import mj.ocraptor.extraction.tika.parser.microsoft.XPSParser; import mj.ocraptor.extraction.tika.parser.microsoft.ooxml.OOXMLParser; import mj.ocraptor.extraction.tika.parser.odf.OpenDocumentParser; import mj.ocraptor.extraction.tika.parser.pdf.PDFParser; import mj.ocraptor.extraction.tika.parser.rtf.RTFParser; import mj.ocraptor.extraction.tika.parser.txt.TXTParser; import mj.ocraptor.extraction.tika.parser.xml.XMLParser; import mj.ocraptor.extraction.tika.parser.xoj.XojParser; import mj.ocraptor.file_handler.filter.FileType; import org.apache.tika.exception.TikaException; import org.apache.tika.mime.MediaType; import org.apache.tika.parser.Parser; import org.xml.sax.SAXException; public class TextExtractorTools { private Config cfg = null; /** * */ public TextExtractorTools() { this.cfg = Config.inst(); } /** * * * @param file * @return * @throws SAXException * @throws TikaException * @throws IOException */ public boolean hasAvailableParsers(final File file) throws IOException, TikaException, SAXException { return getAvailableParsers(file, false).size() > 0 ? true : false; } /** * * * @param file * @return * * @throws IOException * @throws TikaException * @throws SAXException */ public Map<MediaType, Parser> getAvailableParsers(final File file) throws IOException, TikaException, SAXException { return getAvailableParsers(file, true); } /** * * * @param file * @return * @throws IOException * @throws SAXException * @throws TikaException */ private Map<MediaType, Parser> getAvailableParsers(final File file, final boolean createParser) throws IOException, TikaException, SAXException { final Map<MediaType, Parser> availableParsers = new HashMap<MediaType, Parser>(); // ------------------------------------------------ // // -- PDF // ------------------------------------------------ // if (this.cfg.getProp(ConfigBool.INCLUDE_PDF_FILES) && FileType.is(file, FileType.PDF, true)) { availableParsers.put(FileType.PDF.getMediaType(), createParser ? new PDFParser() : null); } // ------------------------------------------------ // // -- Xournal // ------------------------------------------------ // if (this.cfg.getProp(ConfigBool.INCLUDE_XOURNAL_FILES) && FileType.is(file, FileType.XOJ, true)) { availableParsers.put(FileType.XOJ.getMediaType(), createParser ? new XojParser() : null); } // ------------------------------------------------ // // -- WORD // ------------------------------------------------ // OfficeParser msOfficeParser = createParser ? new OfficeParser() : null; OOXMLParser msOfficeOOXMLParser = createParser ? new OOXMLParser() : null; if (this.cfg.getProp(ConfigBool.INCLUDE_MS_WORD_FILES) && (FileType.is(file, FileType.MS_WORD) || FileType.is(file, FileType.MS_WORD_OXML))) { availableParsers.put(FileType.MS_WORD.getMediaType(), msOfficeParser); availableParsers.put(FileType.MS_WORD_OXML.getMediaType(), msOfficeOOXMLParser); } // ------------------------------------------------ // // -- POWERPOINT // ------------------------------------------------ // final boolean includePPT = this.cfg.getProp( // ConfigBool.INCLUDE_MS_POWERPOINT_FILES); if (includePPT && (FileType.is(file, FileType.MS_POWERPOINT) // || FileType.is(file, FileType.MS_POWERPOINT_OXML))) { availableParsers.put(FileType.MS_POWERPOINT.getMediaType(), msOfficeParser); availableParsers.put(FileType.MS_POWERPOINT_OXML.getMediaType(), msOfficeOOXMLParser); } // ------------------------------------------------ // // -- EXCEL // ------------------------------------------------ // final boolean includeExcel = this.cfg.getProp( // ConfigBool.INCLUDE_MS_EXCEL_FILES); if (includeExcel && (FileType.is(file, FileType.MS_EXCEL) // || FileType.is(file, FileType.MS_EXCEL_OXML))) { availableParsers.put(FileType.MS_EXCEL.getMediaType(), msOfficeParser); availableParsers.put(FileType.MS_EXCEL_OXML.getMediaType(), msOfficeOOXMLParser); } // ------------------------------------------------ // // -- CHM // ------------------------------------------------ // // final boolean includeChm = this.cfg.getProp( // // ConfigBool.INCLUDE_MS_CHM_FILES); // if (includeChm && FileType.is(file, FileType.MS_CHM)) { // availableParsers.put(FileType.MS_CHM.getMediaType(), new ChmParser()); // } // ------------------------------------------------ // // -- RTF // ------------------------------------------------ // final boolean includeRTF = this.cfg.getProp( // ConfigBool.INCLUDE_MS_RTF_FILES); if (includeRTF && FileType.is(file, FileType.MS_RTF)) { availableParsers.put(FileType.MS_RTF.getMediaType(), createParser ? new RTFParser() : null); } // ------------------------------------------------ // // -- HTML // ------------------------------------------------ // // TODO: ocr images final boolean includeHTML_XHTML = this.cfg.getProp( // ConfigBool.INCLUDE_HTML_FILES); HtmlParser htmlParser = createParser ? new HtmlParser() : null; if (includeHTML_XHTML && (FileType.is(file, FileType.CODE_HTML) || FileType.is(file, FileType.CODE_XHTML))) { availableParsers.put(FileType.CODE_HTML.getMediaType(), htmlParser); availableParsers.put(FileType.CODE_XHTML.getMediaType(), htmlParser); } // ------------------------------------------------ // // -- XML // ------------------------------------------------ // // TODO: ocr images final boolean includeXML = this.cfg.getProp( // ConfigBool.INCLUDE_XML_FILES); if (includeXML && (FileType.isValidXmlFile(file))) { availableParsers.put(FileType.CODE_XML.getMediaType(), createParser ? new XMLParser() : null); } // ------------------------------------------------ // // -- XPS // ------------------------------------------------ // final boolean includeXPS = this.cfg.getProp( // ConfigBool.INCLUDE_MS_XPS_FILES); if (includeXPS && FileType.is(file, FileType.MS_OXPS)) { availableParsers.put(FileType.MS_OXPS.getMediaType(), createParser ? new XPSParser() : null); } // ------------------------------------------------ // // -- LIBRE OFFICE // ------------------------------------------------ // final OpenDocumentParser odfParser = createParser ? new OpenDocumentParser() : null; if (this.cfg.getProp(ConfigBool.INCLUDE_LO_WRITER_FILES) && FileType.is(file, LO_WRITER, true)) { availableParsers.put(FileType.LO_WRITER.getMediaType(), odfParser); } if (this.cfg.getProp(ConfigBool.INCLUDE_LO_CALC_FILES) && FileType.is(file, LO_CALC, true)) { availableParsers.put(FileType.LO_CALC.getMediaType(), odfParser); } if (this.cfg.getProp(ConfigBool.INCLUDE_LO_IMPRESS_FILES) && FileType.is(file, LO_IMPRESS, true)) { availableParsers.put(FileType.LO_IMPRESS.getMediaType(), odfParser); } // ------------------------------------------------ // // -- APPLE // ------------------------------------------------ // final IWorkPackageParser appleParser = createParser ? new IWorkPackageParser() : null; if (this.cfg.getProp(ConfigBool.INCLUDE_APPLE_PAGES_FILES) && FileType.is(file, APPLE_PAGES, true)) { availableParsers.put(APPLE_PAGES.getMediaType(), appleParser); } if (this.cfg.getProp(ConfigBool.INCLUDE_APPLE_NUMBERS_FILES) && FileType.is(file, APPLE_NUMBERS, true)) { availableParsers.put(APPLE_NUMBERS.getMediaType(), appleParser); } if (this.cfg.getProp(ConfigBool.INCLUDE_APPLE_KEY_FILES) && FileType.is(file, APPLE_KEY, true)) { availableParsers.put(APPLE_KEY.getMediaType(), appleParser); } // ------------------------------------------------ // // -- IMAGE FILES // ------------------------------------------------ // final boolean includeImages = this.cfg.getProp(ConfigBool.INCLUDE_STANDALONE_IMAGE_FILES); if (includeImages && FileType.isValidImageFile(file)) { final ImageParser imageParser = createParser ? new ImageParser() : null; availableParsers.put(FileType.IMAGE_PNG.getMediaType(), imageParser); availableParsers.put(FileType.IMAGE_JPEG.getMediaType(), imageParser); availableParsers.put(FileType.IMAGE_GIF.getMediaType(), imageParser); availableParsers.put(FileType.IMAGE_TIFF.getMediaType(), imageParser); availableParsers.put(FileType.IMAGE_BMP.getMediaType(), imageParser); } // ------------------------------------------------ // // -- POSTSCRIPT FILES // ------------------------------------------------ // if (this.cfg.getProp(ConfigBool.INCLUDE_POSTSCRIPT_FILES) && FileType.is(file, PS, true)) { availableParsers.put(FileType.PS.getMediaType(), null); availableParsers.put(FileType.PDF.getMediaType(), createParser ? new PDFParser() : null); } // ------------------------------------------------ // // -- EPUB FILES // ------------------------------------------------ // if (this.cfg.getProp(ConfigBool.INCLUDE_EPUB_FILES) && FileType.is(file, EPUB, true)) { availableParsers.put(EPUB.getMediaType(), createParser ? new EpubParser() : null); } // ------------------------------------------------ // // -- TEXT FILES // ------------------------------------------------ // if (this.cfg.getProp(ConfigBool.INCLUDE_TEXT_FILES) && FileType.isValidTextFile(file)) { Boolean validSize = validSize(cfg.getProp(ConfigInteger.MAX_TEXT_SIZE_IN_KB), file); if (validSize == null || validSize) { availableParsers.put(FileType.TEXT.getMediaType(), createParser ? new TXTParser() : null); } } return availableParsers; } /** * * * @param maxSize * @param currentFile * @return */ private Boolean validSize(Integer maxSize, File currentFile) { if (maxSize != null) { try { long fileSizeInKB = currentFile.length() / 1024; if (fileSizeInKB < maxSize) return true; else return false; } catch (NumberFormatException e) { e.printStackTrace(); } } return null; } }