Попытка разобрать двоичные данные ... И в большинстве случаев это pdf - PullRequest
2 голосов
/ 16 сентября 2011

Что не так с этим кодом ... Я пытаюсь разобрать pdf-файлы и извлечь из него текст ... Но для некоторых pdf я могу извлечь текст ... А для некоторых выдает ошибку

Invalid dictionary, found: '' but expected: '/'
org.apache.tika.exception.TikaException: Unexpected RuntimeException from org.apache.tika.parser.pdf.PDFParser@67fb878

А также я не получил никаких значений метаданных в переменной md для некоторого pdf ... Но для некоторых я получаю это ...

Это мой код .. !! Некоторая проблема с ByteArray ??

    private BinaryParser binaryParser;
    binaryParser.parse(page.getBinaryData());


    public void parse(byte[] data) {
            InputStream is = null;
            try {
                is = new ByteArrayInputStream(data);
                text = null;
                Metadata md = new Metadata();
                metaData = new HashMap<String, String>();
                text = tika.parseToString(is, md).trim();
                processMetaData(md);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                IOUtils.closeQuietly(is);
            }
        }

private void processMetaData(Metadata md){
        if ((getMetaData() == null) || (!getMetaData().isEmpty())) {
            setMetaData(new HashMap<String, String>());
        }
        for (String name : md.names()){
            getMetaData().put(name.toLowerCase(), md.get(name));
        }
    }

1 Ответ

5 голосов
/ 16 сентября 2011

Тика не идеальна.У него будут проблемы со многими файлами PDF (если многое не изменилось за последний год).Убедитесь, что вы используете обновленную версию Tika.Когда я использовал Tika, это было в версии 0.8 (9 месяцев назад).В этой версии была ошибка, из-за которой анализ PDF был особенно проблематичным.Я обошел проблему, используя PDFBox, который обертывает Apache Tika.В конце этого поста есть часть моего кода, обертывающего PDFBox, на случай, если вы решите попробовать этот маршрут.

Если ничего другого, непосредственное использование PDFBox даст вам больше контроля над параметрами.Одним из таких параметров является обработка "бисерного" текста.Например, газета с колоннами украшена бисером, а буква - нет.PDFBox может пытаться поддерживать поток письма, но он не всегда делает большую работу.Если вы не извлекаете текст из PDF-файлов без бисера, возможно, вы захотите отключить эту функцию.

Возможно, вы также захотите попробовать программу pdftotext .Еще раз, убедитесь, что у вас последняя версия.Со всеми конвертерами PDF в текст производительность быстро меняется с версией!

import org.apache.pdfbox.util.PDFTextStripper;

PDFTextStripper stripper = new PDFTextStripper;

public static String pdfbox(InputStream is, Writer writer) throws IOException, ConversionException {
        Boolean force = true;

        PDDocument document = null;
        try {
            document = PDDocument.load(is, force); // force extraction

            stripper.setForceParsing(force); // continue when errors are encountered.
            stripper.setSortByPosition(false); // text may not be in visual order.
            stripper.setShouldSeparateByBeads(true); // beads are columns, attempt to handle them.

            stripper.writeText(document, writer);
        }
        finally {
            try {
                if (document != null) {
                    document.close();
                }
            }
            catch (Exception e) {
                throw new ConversionException(e);
            }
        }
    }
...