Apache TikaParser выдает неуловимые исключения - PullRequest
0 голосов
/ 09 марта 2020

В настоящее время я пытаюсь разработать инструмент, который использует Apache TikaParser для извлечения контента из разных файлов. В большинстве случаев все работает нормально, но есть некоторые файлы, в которых Тика выдает следующее исключение:

09 марта 2020 г. 11:21:58 org. apache .poi.ss.format.CellFormat ВНИМАНИЕ: Неверный формат: " ([$ € -2] \ *" - ");" java .lang.IllegalArgumentException: неподдерживаемый [] блок формата '[' in ' ([$ € -2] \ * "-" )' с c2: null в org. apache .poi .ss.format.CellFormatPart.formatType (CellFormatPart. java: 373) в орг. apache .poi.ss.format.CellFormatPart.getCellFormatType (CellFormatPart. java: 287) в орг. apache .poi .ss.format.CellFormatPart. (CellFormatPart. java: 191) в орг. apache .poi.ss.format.CellFormat. (CellFormat. java: 193) в орг. apache .poi.ss .format.CellFormat.getInstance (CellFormat. java: 167) в орг. apache .poi.ss.usermodel.DataFormatter.getFormat (DataFormatter. java: 343) в орг. apache .poi.ss .usermodel.DataFormatter.formatRawCellContents (DataFormatter. java: 901) в орг. apache .poi.ss.usermodel.DataFormatter.formatRawCellContents (DataFormatter. java: 873) в орг. apache .poi.hssf .eventusermodel.FormatTrackingHSSFListener.formatNumberDateCell (FormatTrackingHSSFListener. java: 143) в org. apache .tika.parser.microsoft.ExcelExtractor $ TikaHSSFListener $ TikaFormatTrackingHSSFLumbererfor ateCell (ExcelExtractor. java: 673) в орг. apache .tika.parser.microsoft.ExcelExtractor $ TikaHSSFListener.internalProcessRecord (ExcelExtractor. java: 447) в орг. apache .tika.parser.microsoft. ExcelExtractor $ TikaHSSFListener.processRecord (ExcelExtractor. java: 340) в орг. apache .poi.hssf.eventusermodel.FormatTrackingHSSFListener.processRecord (FormatTrackingHSSFListener. java: 92) в org. microsoft.ExcelExtractor $ TikaHSSFListener $ TikaFormatTrackingHSSFListener.processRecord (ExcelExtractor. java: 666) в орг. poi.hssf.eventusermodel.HSSFEventFactory.genericProcessEvents (HSSFEventFactory. java: 178) в орг. apache .poi.hssf.eventusermodel.HSSFEventFactory.processEvents (HSSFEventFactory. * 10 *. tika.parser.microsoft.ExcelExtractor $ TikaHSSFListener.processFile (ExcelExtractor. java: 316) в орг. apache .tika.parser.microsoft.ExcelExtractor.parse (ExcelExtractor. java: 169) в орг. apache .tika.parser.microsoft.OfficeParser.parse (OfficeParser. java: 183) в орг. apache .tika.parser.microsoft.OfficeParser.parse (OfficeParser. java: 131) в орг. apache .tika.parser.CompositeParser.parse (CompositeParser. java: 280) в орг. apache .tika.parser.ParserDecorator.parse (ParserDecorator. java: 188) в орг. apache .tika.parser.CompositeParser.parse (CompositeParser. java: 280) в орг. apache .tika.parser.CompositeParser.parse (CompositeParser. java: 280) в орг. apache .tika .parser.AutoDetectParser.parse (AutoDetectParser. java: 143) в attpro c .processors.AttachmentProcessor.run (AttachmentProcessor. java: 68) в attpro c .Main.lambda $ main $ 0 (Main. java: 89) в java .base / java .util.concurrent.CompletableFuture $ AsyncSupply.run (CompletableFuture. java: 1700) в java .base / java .util.concurrent. ThreadPoolExecutor.runWorker (ThreadPoolExecutor. java: 1128) в java .base / java .util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor. java: 628) в java .base / java .la ng.Thread.run (Thread. java: 834)

Я пытаюсь отловить это исключение с помощью следующего кода:

 try {
                        byte[] content = Files.readAllBytes(path);
                        try {
                            Metadata metadata = new Metadata();
                            BodyContentHandler handler = new BodyContentHandler(-1);
                            ParseContext parseContext = new ParseContext();
                            parseContext.set(PDFParserConfig.class, tikaConfig.pdfConfig);

                            try {
                                tikaConfig.autoDetectParser.parse(new ByteArrayInputStream(content), handler, metadata, parseContext);
                                text = Optional.ofNullable(handler.toString()).orElse("");
                            } catch (Exception ignored) {}

                        } catch (Exception ignored) {
                        }

                    } catch (IOException ignored) {
                    }

"tikaConfig" является объект singleton:

public class TikaConfiguration {
    private final TikaConfig tikaConfig;
    public final PDFParserConfig pdfConfig;
    public final Parser autoDetectParser;

    private static TikaConfiguration instance;

    private TikaConfiguration() throws Exception {
        ClassLoader classLoader = getClass().getClassLoader();
        InputStream stream = classLoader.getResourceAsStream("tikaconfig.xml");
        this.tikaConfig = new TikaConfig(stream);
        this.pdfConfig = new PDFParserConfig();
        pdfConfig.setExtractInlineImages(false);

        tikaConfig.getDetector();
        autoDetectParser = new AutoDetectParser(tikaConfig);
    }

    public static TikaConfiguration setConfiguration() {
        if (TikaConfiguration.instance == null) {
            try {
                TikaConfiguration.instance = new TikaConfiguration();
            } catch (Exception ignored) {}
        }

        return TikaConfiguration.instance;
    }
}

Что мне нужно сделать, чтобы перехватить это исключение?

1 Ответ

0 голосов
/ 20 марта 2020

Взгляните на эту несколько старую ветку. То, что вы видите, выглядит очень похоже. Предполагается, что библиотека POI, используемая Tika для синтаксического анализа Excel, выдает предупреждение, а не ошибку (и ваш вывод в журнал также отражает это). Это предупреждение включает в свой журнал трассировку стека (перехватывается, как я полагаю, POI, а затем передается в Tika).

Следовательно, предупреждение не будет перехвачено вашим кодом (это не исключение).

Как один из комментаторов упоминает в JIRA:

Я не уверен, что это даже ошибка. Это вывод POILogger, а не, например, printStackTrace ().

Независимо от статуса ошибки, в JIRA также предлагается обходной путь: при запуске приложения перенаправьте поток ошибок на ноль (приведен пример).

Я скачал электронную таблицу, прилагаемую к JIRA, и мне удалось воссоздать их версию вашего сообщения:

WARNING: Invalid format: "_([$Ç-2]\ * #,##0.00_);"
java.lang.IllegalArgumentException: Unsupported [] format block '[' in '_([$Ç-2]\ * #,##0.00_)' with c2: null
    at org.apache.poi.ss.format.CellFormatPart.formatType(CellFormatPart.java:373)
    at org.apache.poi.ss.format.CellFormatPart.getCellFormatType(CellFormatPart.java:287)
    at org.apache.poi.ss.format.CellFormatPart.<init>(CellFormatPart.java:191)
    at org.apache.poi.ss.format.CellFormat.<init>(CellFormat.java:193)
...

Однако моя программа завершилась успешно. Он продолжал генерировать свой вывод правильно.

...