Вопрос по java, itext, pdftotext – itext Java PDF для создания текста

1

Я использую itext для преобразования pdf в текстовый файл, на самом деле он работает хорошо, но для некоторых слов он делает следующее: например, в pdf есть фраза типа "представить основные идеи но itext создает вывод вродеpresentthemainideas», Есть ли способ исправить это поведение?

            String pdf="/home/can/Downloads/NLP/textSummarization/A New Approach for  Multi-Document Update Summarization.pdf";
    String txt="/home/can/myWorkSpace/PDFConverterProject/outputs/bb.txt";
    StringBuffer text=new StringBuffer() ;
    String resultText="";
    PdfReader reader;
    try {
        reader = new PdfReader(pdf);
        PdfReaderContentParser parser = new PdfReaderContentParser(reader);
        PrintWriter out = new PrintWriter(new FileOutputStream(txt));
        TextExtractionStrategy strategy;
        for (int i = 1; i 
Добавьте фрагмент кода и краткое объяснение того, что вы уже пробовали. heikkim
я добавляю код, который использую canromero

Ваш Ответ

2   ответа
7

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

К сожалению, тот же механизм также используется для улучшения внешнего вида соседних глифов: в некоторых буквенных комбинациях для хорошего внешнего вида и удобства чтения глифы должны быть напечатаны ближе друг к другу или дальше друг от друга, чем было бы по умолчанию. Это делается в PDF-файлах, используя ту же операцию, что и выше.

Таким образом, анализатор PDF в таких ситуациях должен использовать эвристику, чтобы решить, должен ли такой сдвиг означать символ пробела или он просто предназначен для того, чтобы группа букв выглядела хорошо. И эвристика может потерпеть неудачу.

Ты используешьSimpleTextExtractionStrategyкак стратегия извлечения текста. Эвристика в этом случае реализована так (как в настоящее время вrenderTextметод вSimpleTextExtractionStrategy.java в багажнике iText SVN):

float spacing = lastEnd.subtract(start).length();
if (spacing > renderInfo.getSingleSpaceWidth()/2f)
{
    result.append(' ');
}

Таким образом, пробел, который по меньшей мере вдвое меньше текущей ширины в виде пробела, переводится в пробел.

Это обычно звучит разумно. Однако в случае документов, в которых для разделения слов используются только горизонтальные сдвиги, текущая ширина фактического пробела может не быть хорошей мерой для эвристики.

Итак, вы можете попытаться улучшить эвристику в стратегии извлечения текста. Скопируйте существующий, манипулируйте им и используйте его в своем коде.

Если вы предоставите образец PDF для вашей проблемы, у нас могут быть некоторые идеи, чтобы помочь.

И он находит такой символ, как это пример слова "разница» чем результат становится "ди Ф.Ф.разностная»; "ff" персонаж - это один персонаж ... canromero
Двойной f как один глиф - довольно распространенная вещь, так называемая лигатура. Есть и другие типичные лигатуры. Для поиска текста вы, очевидно, захотите разрешить их, но в противном случае лигатура - это символ на странице. mkl
Я реализую MySimpleTextExtractionStrategy и использую: `if (spacing> renderInfo.getSingleSpaceWidth () / 4f) {result.append (' '); //System.out.println (»Вставка подразумеваемого пространства перед '" + renderInfo.getText () + "'"); } `Теперь это лучше, чем раньше, покрытие% 90, я думаю, но% 100 невозможно, верно? canromero
И да, как только вы распознаете в качестве пробелов 100% пробелов, которые подразумеваются как пробелы, вы, несомненно, также ошибочно распознаете в качестве пробелов некоторые пробелы, которые не были заданы как таковые. mkl
1

здесь приведено подробное описание конкретного варианта вопроса, представленного в вопросе. Я наткнулся на документ, из которого я хотел извлечь текст. Каждое письмо выходило через пробел.

text would read as "t e x t"

Я попытался реализовать свой собственный класс стратегии извлечения, как описано в MKL. Какой бы фактор я ни пытался применить кширина одного пространства значение, текст вышел так же, как и раньше. Поэтому я отладил свой код, чтобы увидетьзначение ширины сам и оказался 0.

Чтобы обойти это, вы можете использовать фиксированное значение в коде, обозначенном mkl:

float spacing = lastEnd.subtract(start).length();
if (spacing > someFixValue)
{
    result.append(' ');
}

если вы основываете свою собственную стратегию добычиLocationTextExtractionStrategyметод, который вы хотите переопределить:IsChunkAtWordBoundary (...)

Похожие вопросы