Извлечение текста по строкам из PDF с помощью iTextSharp c #

Мне нужно провести некоторый анализ при извлечении данных из PDF-документа.

Используя iTextSharp, я использовал метод PdfTextExtractor.GetTextFromPage для извлечения содержимого из документа PDF, и он вернул мне одну длинную строку.

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

Ниже приведен код, который я использовал:

       string urlFileName1 = "pdf_link";
        PdfReader reader = new PdfReader(urlFileName1);
        string text = string.Empty;
        for (int page = 1; page <= reader.NumberOfPages; page++)
        {
            text += PdfTextExtractor.GetTextFromPage(reader, page);
        }
        reader.Close();
        candidate3.Text = text.ToString();

person Xander    schedule 01.04.2013    source источник
comment
Xander несколько вопросов .. во-первых, PdfReader(urFileName) `читает ли все строки сразу во время этого вызова ..? если это так, то вам, вероятно, нужно изменить этот цикл for на цикл while и вызвать метод reader.ReadLine(). Я смотрю, как можно было бы нормально читать, используя класс StreamReader, дайте мне знать, существует ли метод .ReadLine () Чтение содержимого PDF проверьте эту ссылку   -  person MethodMan    schedule 01.04.2013
comment
Привет, @DJKRAZE. Да, PdfReader (urlFileName1) прочитал все строки сразу. Я не думаю, что в iTextSharp есть метод .ReadLine (). Зашел в их API и не смог его найти. Не могли бы вы сделать образец, чтобы показать, что вы имеете в виду под циклом while?   -  person Xander    schedule 01.04.2013
comment
посмотрите на это Previous Stackoverflow сообщение, оно должно указать вам правильное направление stackoverflow.com/questions/2550796/   -  person MethodMan    schedule 01.04.2013
comment
PdfTextExtractor.GetTextFromPage(reader, page) использует LocationTextExtractionStrategy, который, в свою очередь, вставляет '\n' при изменении текстовой строки. Если это не для вас, что-то подозрительно. Не могли бы вы поэтому предоставить PDF-файл для проверки?   -  person mkl    schedule 02.04.2013
comment
привет @mkl Я не уверен, вставляет ли он '\ n', потому что, когда я распечатываю текст в моем браузере, он показывает длинную строку. Может быть, я неправильно добавляю текст? Если да, как мне добавить текст, чтобы отображать или разбивать каждую строку с помощью символа '\ n' и сохранять их в массиве вместо String? Это мой PDF для проверки.   -  person Xander    schedule 02.04.2013
comment
попробуйте текст.Заменить (\ n, ‹br/›)   -  person VahidN    schedule 02.04.2013
comment
привет @VahidN, отлично работает. Как я могу сохранить каждую строку в массиве?   -  person Xander    schedule 02.04.2013
comment
Либо вы разделяете строку на символы новой строки, либо создаете свой собственный RenderListener, который напрямую создает массивы строк.   -  person mkl    schedule 02.04.2013


Ответы (6)


Я знаю, что это публикация в более старом сообщении, но я потратил много времени, пытаясь понять это, поэтому я собираюсь поделиться этим для будущих людей, пытающихся найти это в Google:

using System;
using System.Text;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;

namespace PDFApp2
{
class Program
{
    static void Main(string[] args)
    {

        string filePath = @"Your said path\the file name.pdf";
        string outPath = @"the output said path\the text file name.txt";
        int pagesToScan = 2;

        string strText = string.Empty;
        try
        {
            PdfReader reader = new PdfReader(filePath);

            for (int page = 1; page <= pagesToScan; page ++) //(int page = 1; page <= reader.NumberOfPages; page++) <- for scanning all the pages in A PDF
            {
                ITextExtractionStrategy its = new iTextSharp.text.pdf.parser.LocationTextExtractionStrategy();
                strText = PdfTextExtractor.GetTextFromPage(reader, page, its);

                strText = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(strText)));
                //creating the string array and storing the PDF line by line
                string[] lines = strText.Split('\n');
                foreach (string line in lines)
                {
                    //Creating and appending to a text file
                    using (System.IO.StreamWriter file = new System.IO.StreamWriter(outPath, true))
                    {
                        file.WriteLine(line);
                    }
                }
            }

            reader.Close();
        }
        catch (Exception ex)
        {
            Console.Write(ex);
        }
    }
}
}

Я читал программу в формате PDF по заданному пути и просто выводил в текстовый файл, но вы можете манипулировать этим для чего угодно. Это было основано на ответе Снзива Гупты.

person supersoka    schedule 16.08.2018

Все остальные примеры кода здесь не работали для меня, вероятно, из-за изменений в API itext7.

Этот минимальный пример здесь работает нормально:

var pdfReader = new iText.Kernel.Pdf.PdfReader(fileName);
var pdfDocument = new iText.Kernel.Pdf.PdfDocument(pdfReader);
var contents = iText.Kernel.Pdf.Canvas.Parser.PdfTextExtractor.GetTextFromPage(pdfDocument.GetFirstPage());
person dodgy_coder    schedule 05.05.2020
comment
GetTextFromPage имеет перегрузку, которая также позволяет передавать ITextExtractionStrategy. - person Jan Van der Haegen; 21.05.2020

LocationTextExtractionStrategy автоматически вставит '\ n' в выходной текст. Однако иногда он вставляет '\ n' там, где этого не следует. В этом случае вам нужно создать собственный TextExtractionStrategy или RenderListener. По сути, код, который обнаруживает новую строку, - это метод

public virtual bool SameLine(ITextChunkLocation other) {
            return OrientationMagnitude == other.OrientationMagnitude &&
                   DistPerpendicular == other.DistPerpendicular;
        }

В некоторых случаях '\ n' не следует вставлять, если есть лишь небольшая разница между DistPerpendicular и other.DistPerpendicular, поэтому вам нужно изменить его на что-то вроде Math.Abs ​​(DistPerpendicular - other.DistPerpendicular) ‹10

Или вы можете поместить этот фрагмент кода в метод RenderText вашего пользовательского класса TextExtractionStrategy / RenderListener

person Silent Sojourner    schedule 06.07.2017

Используйте LocationTextExtractionStrategy вместо SimpleTextExtractionStrategy. LocationTextExtractionStrategy извлеченный текст содержит символ новой строки в конце строки.

ITextExtractionStrategy Strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), renderFilter);
string pdftext = PdfTextExtractor.GetTextFromPage(reader,pageno, Strategy);
string[] words = pdftext.Split('\n');
return words;
person Kumar Sandeep    schedule 26.03.2014

Пытаться

 String page = PdfTextExtractor.getTextFromPage(reader, 2);
 String s1[]=page.split("\n"); 
person adebayo    schedule 09.05.2013

person    schedule
comment
Публикуя ответы, всегда включайте краткую информацию о том, как работает ваш код и что именно он делает. Обычно недостаточно просто опубликовать фрагмент кода. - person Robert Rossmann; 02.01.2015