Подтвердить что ты не робот

Исправление текста Itextsharp

Я использую itextsharp на vb.net, чтобы получить текстовое содержимое из файла pdf. Решение работает отлично для некоторых файлов, но не для других даже довольно простых. Проблема заключается в том, что значение токена string равно null (набор пустых квадратов)

token = New iTextSharp.text.pdf.PRTokeniser(pageBytes)
    While token.NextToken()
        tknType = token.TokenType()
        tknValue = token.StringValue

Я могу измерить длину содержимого, но я не могу получить фактическое содержимое строки.

Я понял, что это происходит в зависимости от шрифта pdf. Если я создаю pdf файл, используя Acrobat или PdfCreator с Courier (который, кстати, является шрифтом по умолчанию в редакторе visual studio), я могу получить весь текстовый контент. Если один и тот же pdf построен с использованием другого шрифта, я получил пустые квадратные поля.

Теперь возникает вопрос: как я могу извлечь текст независимо от настройки шрифта?

Спасибо

4b9b3361

Ответ 1

дополняющий ответ Mark, который мне очень помогает. Имена пространств и классов реализации iTextSharp немного отличаются от java-версии

 public static string GetTextFromAllPages(String pdfPath)
    {
        PdfReader reader = new PdfReader(pdfPath); 

        StringWriter output = new StringWriter();  

        for (int i = 1; i <= reader.NumberOfPages; i++) 
            output.WriteLine(PdfTextExtractor.GetTextFromPage(reader, i, new SimpleTextExtractionStrategy()));

        return output.ToString();
    }

Ответ 2

Отъезд PdfTextExtractor.

String pageText = 
  PdfTextExtractor.getTextFromPage(myReader, pageNum);

или

String pageText = 
  PdfTextExtractor.getTextFromPage(myReader, pageNum, new LocationTextExtractionStrategy());

Оба требуют довольно свежих версий iText [Sharp]. Фактически синтаксический анализ потока контента сам по себе - это просто изобретать колесо в этот момент. Поставьте себе немного боли, и пусть iText сделает это за вас.

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

Ответ 3

Вот вариант с iTextSharp.text.pdf.PdfName.ANNOTS и iTextSharp.text.pdf.PdfName.CONTENT, если кому-то это нужно.

        string strFile = @"C:\my\path\tothefile.pdf";
        iTextSharp.text.pdf.PdfReader pdfRida = new iTextSharp.text.pdf.PdfReader(strFile);
        iTextSharp.text.pdf.PRTokeniser prtTokeneiser;
        int pageFrom = 1;
        int pageTo = pdfRida.NumberOfPages;
        iTextSharp.text.pdf.PRTokeniser.TokType tkntype ;
        string tknValue;

        for (int i = pageFrom; i <= pageTo; i++) 
        {
            iTextSharp.text.pdf.PdfDictionary cpage = pdfRida.GetPageN(i);
            iTextSharp.text.pdf.PdfArray cannots = cpage.GetAsArray(iTextSharp.text.pdf.PdfName.ANNOTS);

            if(cannots!=null)
                foreach (iTextSharp.text.pdf.PdfObject oAnnot in cannots.ArrayList) 
                {
                    iTextSharp.text.pdf.PdfDictionary cAnnotationDictironary = (iTextSharp.text.pdf.PdfDictionary)pdfRida.GetPdfObject(((iTextSharp.text.pdf.PRIndirectReference)oAnnot).Number);

                    iTextSharp.text.pdf.PdfObject moreshit = cAnnotationDictironary.Get(iTextSharp.text.pdf.PdfName.CONTENTS);
                    if (moreshit != null && moreshit.GetType() == typeof(iTextSharp.text.pdf.PdfString)) 
                    {
                        string cStringVal = ((iTextSharp.text.pdf.PdfString)moreshit).ToString();
                        if (cStringVal.ToUpper().Contains("LOS 8"))
                        { // DO SOMETHING FUN

                        }
                    }
                }
        }
        pdfRida.Close();