Как извлечь текст с помощью iTextSharp 4.1.6?

iTextSharp 4.1.6 - последняя версия под лицензией LGPL, которую можно бесплатно использовать в коммерческих целях без уплаты лицензионных сборов.

Некоторым и мне может быть интересно, как извлечь текст с помощью этой версии.

Есть у кого-нибудь идеи?


person der_chirurg    schedule 13.04.2012    source источник
comment
См. Пример по следующей ссылке: stackoverflow.com/questions/2550796/   -  person Hans    schedule 13.04.2012
comment
@Hans, это решение работает с 4.1.6? ITextExtractionStrategy, SimpleTextExtractionStrategy и PdfTextExtractor мне неизвестны.   -  person Örjan Jämte    schedule 13.09.2012
comment
Я пробовал использовать код из codeproject. ru / Articles / 14170 /. Я обнаружил, что это работает только для некоторых PDF-файлов; и он выбрасывает IndexOutOfRangeExceptions в CheckToken, когда он вызывается с односимвольными аргументами (как в этом примере).   -  person Glenn Barnett    schedule 26.10.2012
comment
Вы когда-нибудь находили решение?   -  person SpoiledTechie.com    schedule 07.08.2013
comment
@ SpoiledTechie.com Нет, не пытался исправить. Я просто использовал другое решение.   -  person der_chirurg    schedule 08.08.2013


Ответы (1)


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

var reader = new PdfReader(fileName);

StringBuilder sb = new StringBuilder();

try
{
    for (int page = 1; page <= reader.NumberOfPages; page++)
    {
        var cpage = reader.GetPageN(page);
        var content = cpage.Get(PdfName.CONTENTS);

        var ir = (PRIndirectReference)content;

        var value = reader.GetPdfObject(ir.Number);

        if (value.IsStream())
        {
            PRStream stream = (PRStream)value;

            var streamBytes = PdfReader.GetStreamBytes(stream);

            var tokenizer = new PRTokeniser(new RandomAccessFileOrArray(streamBytes));

            try
            {
                while (tokenizer.NextToken())
                {
                    if (tokenizer.TokenType == PRTokeniser.TK_STRING)
                    {
                        string str = tokenizer.StringValue;
                        sb.Append(str);
                    }
                }
            }
            finally
            {
                tokenizer.Close();
            }
        }
    }
}
finally
{
    reader.Close();
}

return sb.ToString();
person Paul    schedule 24.11.2013
comment
Это одно из часто встречающихся решений по извлечению текста для бедняков. На самом деле возможности извлечения текста в iText 2.1.7 / 4.2.0 были намного более продвинутыми (несмотря на некоторые недостатки). Скорее всего, они также присутствуют в последней версии iTextSharp до изменения лицензии. Попробуйте! - person mkl; 25.11.2013
comment
@mkl - в iTextSharp в этой версии нет PdfTextExtractor, по крайней мере, в NuGet-пакете iTextSharp-LGPL. Это был единственный способ, которым я мог это сделать. Если вы знаете лучший способ, который на самом деле находится в DLL, я был бы признателен! - person Paul; 25.11.2013
comment
Также я нашел случай, когда контент не является PRIndirectReference, а вместо этого представляет собой PdfArray из PRIndirectReferences, так что этот случай также должен обрабатываться соответствующим образом. - person Paul; 25.11.2013
comment
Вы правы, мое предположение, что возможности извлечения текста версии Java были перенесены на iTextSharp до изменения лицензии, неверно. Таким образом, я не могу придумать другого пути, кроме как самостоятельно перенести классы парсера с Java iText 4.2.0 на C #. Я понятия не имею, насколько это легко или сложно. Или, конечно, вы можете попробовать переключиться на текущую версию iTextSharp, как только AGPL или коммерческое лицензирование станут для вас вариантом. - person mkl; 25.11.2013