Itextsharp извлечение текста - PullRequest
       2

Itextsharp извлечение текста

17 голосов
/ 17 января 2011

Я использую itextsharp на vb.net, чтобы получить текстовое содержимое из PDF-файла. Решение отлично работает для некоторых файлов, но не для других, даже довольно простых. Проблема в том, что значение строки токена имеет значение 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-файл построен с использованием другого шрифта, я получаю пустые квадратные поля.

Теперь вопрос в том, как извлечь текст независимо от настроек шрифта?

Спасибо

Ответы [ 3 ]

41 голосов
/ 13 апреля 2011

дополняет ответ Марка, который мне очень помогает. Пространства имен и классы реализации .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();
    }
14 голосов
/ 04 февраля 2011

Извлечение PdfTextExtractor .

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

или

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

Для обеих версий требуются довольно свежие версии iText [Sharp].Фактически, анализируя поток контента самостоятельно, вы просто изобретаете колесо.Избавьте себя от боли и позвольте iText сделать это за вас.

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

4 голосов
/ 26 апреля 2012

Вот вариант с 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();
...